Python 在matplotlib中优雅地更改打印框的颜色
这是一个后续问题,讨论了轴、记号和标签的颜色。我希望可以为这个问题提出一个新的、扩展的问题 使用轴[ax1,ax2]更改双打印(通过Python 在matplotlib中优雅地更改打印框的颜色,python,colors,matplotlib,Python,Colors,Matplotlib,这是一个后续问题,讨论了轴、记号和标签的颜色。我希望可以为这个问题提出一个新的、扩展的问题 使用轴[ax1,ax2]更改双打印(通过add_subplot)周围完整帧(记号和轴)的颜色会导致大量代码。此代码段将更改上部打印框的颜色: 因此,要更改两个分别具有两个y轴的绘图的帧颜色,我需要16(!)行代码。。。这就是它的样子: 到目前为止,我还找到了其他方法: matplotlib.rc:已讨论;全球变化,而不是局部变化。我想有一些不同颜色的其他情节。请不要讨论绘图中的颜色太多…:-) 挖出
add_subplot
)周围完整帧(记号和轴)的颜色会导致大量代码。此代码段将更改上部打印框的颜色:
因此,要更改两个分别具有两个y轴的绘图的帧颜色,我需要16(!)行代码。。。这就是它的样子:
到目前为止,我还找到了其他方法:
- matplotlib.rc:已讨论;全球变化,而不是局部变化。我想有一些不同颜色的其他情节。请不要讨论绘图中的颜色太多…:-)
- 挖出轴的刺,然后改变它:也讨论了;我觉得不是很优雅
for child in ax.get_children(): if isinstance(child, matplotlib.spines.Spine): child.set_color('#dddddd')
我正在ubuntu下使用python 2.6.5和matplotlib 0.99.1.1。假设您使用的是matplotlib(>=1.0)的合理最新版本,或许可以尝试以下方法:
import matplotlib.pyplot as plt
# Make the plot...
fig, axes = plt.subplots(nrows=2)
axes[0].plot(range(10), 'r-')
axes[1].plot(range(10), 'bo-')
# Set the borders to a given color...
for ax in axes:
ax.tick_params(color='green', labelcolor='green')
for spine in ax.spines.values():
spine.set_edgecolor('green')
plt.show()
也许回答我自己的问题有点粗糙,但我想与大家分享我目前能找到的东西。此版本可以用两种不同的颜色对轴
[ax1,ax2]
和[ax3,ax4]
的两个子批次进行着色。这比我在上面的问题中所说的16行要短得多。它的灵感来源于Joe Kington在这里和中的回答
我将此标记为已接受,因为这是迄今为止我能找到的最紧凑的解决方案。尽管如此,我还是愿意用其他可能更优雅的方法来解决这个问题。重构上面的代码:
import matplotlib.pyplot as plt
for ax, color in zip([ax1, ax2, ax3, ax4], ['green', 'green', 'blue', 'blue']):
plt.setp(ax.spines.values(), color=color)
plt.setp([ax.get_xticklines(), ax.get_yticklines()], color=color)
我知道这个问题已经得到了回答,但是你可以使用列表理解来把它变成一行。例如,在《朱莉娅》中
ax1.spines['bottom'].set_color('green')
ax1.spines['top'].set_color('green')
ax1.spines['left'].set_color('green')
ax1.spines['right'].set_color('green')
变成
[ax1.spines[x].set_color("green") for x in ["bottom","top","left","right"]]
我运行matplotlib 0.99.1.1(哦!)。我也没有很好地解释双重情节。我更新了最初的问题并添加了一个图表。您展示了另一种可能的axes着色,我可以将其添加到我的列表中(如果运行最新版本的m.p.l.)。如果你在一个图中用两个y轴给一个框架上色,你的还短吗?很好。请包括这两种颜色,我会接受你的回答。(比如:
对于ax,zip中的颜色([ax1,ax2,ax3,ax4],'green','green','blue','blue']):plt.setp(ax.spines.values(),color=color);plt.setp([ax.get\xticklines(),ax.get\yticklines(),color=color)
)在你的最后一行中,我想你的意思是ax1
ax确实是@Joel.)我现在已经纠正了它(4年多之后)。仅供参考,ax.spines.values()
在Py3中不起作用,因为plt.setp
只接受可索引对象。在Py3中,字典值是可索引的,但不可索引。我正在研究一个PR来为后代修复它(我的意思是让setp
接受任何可移植的,而不是Py3中的fixvalues()
)。@madpysicator谢谢,是的,现在我只是使用元组(ax.spines.values())
来更改它们的颜色plt.setp
。如果它适用于任意可编辑性,那么它将非常有用。列表理解通常用于创建/修改列表,而不是调用函数。
import matplotlib.pyplot as plt
for ax, color in zip([ax1, ax2, ax3, ax4], ['green', 'green', 'blue', 'blue']):
plt.setp(ax.spines.values(), color=color)
plt.setp([ax.get_xticklines(), ax.get_yticklines()], color=color)
ax1.spines['bottom'].set_color('green')
ax1.spines['top'].set_color('green')
ax1.spines['left'].set_color('green')
ax1.spines['right'].set_color('green')
[ax1.spines[x].set_color("green") for x in ["bottom","top","left","right"]]