Matplotlib: изменить цвет отдельных линий сетки

Я использую Python всего около месяца, поэтому извините, если есть какое-то простое решение, которое я упустил.

В основном у меня есть рисунок с 4 подграфиками, 2 слева показывают продольные графики, а те, что справа, показывают графики рассеяния в определенных точках продольных графиков. Вы можете щелкать по точечным графикам в разных точках продольного графика с помощью кнопок, и метка галочки продольного графика, на котором вы сейчас находитесь, будет выделена синим цветом.

Окрашивание определенной метки галочки уже работает с этим:

xlabels = []
labelcolors = []

for i, item in enumerate(mr.segmentlst):
    if re.search('SFX|MC|MQ|MS|MKC', item):
        xlabels.append(mr.segmentlst[i])
    else:
        xlabels.append('')

for i, item in enumerate(mr.segmentlst):
    if re.search('SFX', item):
        labelcolors.append('black')
    else:
        labelcolors.append('gray')

labelcolors[self.ind]='blue'      

[t.set_color(i) for (i,t) in zip(labelcolors, ax1.xaxis.get_ticklabels())]
[t.set_color(i) for (i,t) in zip(labelcolors, ax2.xaxis.get_ticklabels())]

Он показывает только определенные галочки и соответственно меняет их цвет (я не знаю, есть ли другое решение для этого, это единственное, что я смог найти). Не обращайте внимания на mr.segmentlist, в настоящее время я жестко закодировал график для использования атрибута из другого метода, поэтому я могу легко продолжать тестировать его в Spyder.

Я хотел бы также изменить цвет линии сетки выделенной в данный момент метки галочки (видны только xgridlines) на продольных графиках, есть ли какой-то аналогичный способ сделать это? Я искал в Интернете решение около 2 часов и не нашел ничего полезного.

Я подумал, что можно использовать что-то вроде ax1.get_xgridlines(), но понятия не имею, как преобразовать его в полезный список.

Спасибо, Тамара.


person Sithis    schedule 18.08.2015    source источник


Ответы (2)


get_xgridlines() возвращает список объектов Line2D, поэтому, если вы можете найти линию, которую хотите изменить, вы можете изменить любое из их свойств.

x = np.random.random_sample((10,))
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x,x)
ax.grid()
a = ax.get_xgridlines()
b = a[2]
b.set_color('red')
b.set_linewidth(3)

введите описание изображения здесь

person Diziet Asahi    schedule 18.08.2015
comment
Круто, спасибо, это именно то, что мне было нужно! :) - person Sithis; 18.08.2015
comment
есть идеи, как это будет работать, если у меня есть основные и второстепенные линии сетки, и я хочу обратиться к второстепенным? (get_xgridlines() возвращает только основную сетку) - person raphael; 02.10.2018
comment
Что, если бы я хотел раскрасить только сегмент линии сетки (скажем, от 0,3 до 0,5 на приведенном выше рисунке)? - person ANIRUDH BUVANESH; 15.07.2021

поскольку приведенное выше решение работает только с основными линиями сетки (поскольку get_gridlines() в настоящее время жестко закодировано для использования только основных), вот как вы также можете получить доступ к второстепенным линиям сетки, адаптировав функция get_gridlines() (отсюда):

from matplotlib import cbook
def get_gridlines(ax, which):
        '''
        Parameters: 
            ax : ax.xaxis or ax.yaxis instance

            which : 'major' or 'minor'
        Returns:
            The grid lines as a list of Line2D instance    

        '''

        if which == 'major':
            ticks = ax.get_major_ticks()
        if which == 'minor':
            ticks = ax.get_minor_ticks()

        return cbook.silent_list('Line2D gridline',
                                 [tick.gridline for tick in ticks])
person raphael    schedule 03.10.2018