Matplotlib:改变个别网格线的颜色
Matplotlib: Change color of individual grid lines
我现在只使用 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()
之类的东西,但我不知道如何将其转换为有用的列表。
谢谢,
塔玛拉
get_xgridlines()
returns 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)
因为上述解决方案仅适用于 主要 网格线
(因为 get_gridlines() 目前被硬编码为仅使用主要的),
以下是您还可以通过调整访问 minor 网格线的方法
get_gridlines() 函数 (from here):
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])
我现在只使用 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()
之类的东西,但我不知道如何将其转换为有用的列表。
谢谢, 塔玛拉
get_xgridlines()
returns 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)
因为上述解决方案仅适用于 主要 网格线 (因为 get_gridlines() 目前被硬编码为仅使用主要的), 以下是您还可以通过调整访问 minor 网格线的方法 get_gridlines() 函数 (from here):
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])