Matplotlib:更改单个网格线的颜色

8

我只使用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()这样的东西,但我不知道如何将其转换为有用的列表。
谢谢, Tamara
2个回答

18

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)

在此输入图片描述


1
太棒了,谢谢你,这正是我所需要的! :) - Sithis
2
有任何想法如何在我有主要和次要网格线并且我想寻址次要网格线的情况下使其工作?(get_xgridlines()似乎只返回主要网格线) - raphael
1
如果我想要给网格线的一部分上色(例如上图中的0.3到0.5),该怎么办? - ANIRUDH BUVANESH

4

由于上面的解决方案仅适用于主要网格线(因为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])

我也遇到了同样的问题,决定完全关闭网格线,并使用带有axis.axvline()的自定义垂直线。但是你提供的源代码背后原因的线索对于那些正在学习matplotlib的人非常有帮助... - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接