Python 在matplotlib中优雅地更改打印框的颜色

Python 在matplotlib中优雅地更改打印框的颜色,python,colors,matplotlib,Python,Colors,Matplotlib,这是一个后续问题,讨论了轴、记号和标签的颜色。我希望可以为这个问题提出一个新的、扩展的问题 使用轴[ax1,ax2]更改双打印(通过add_subplot)周围完整帧(记号和轴)的颜色会导致大量代码。此代码段将更改上部打印框的颜色: 因此,要更改两个分别具有两个y轴的绘图的帧颜色,我需要16(!)行代码。。。这就是它的样子: 到目前为止,我还找到了其他方法: matplotlib.rc:已讨论;全球变化,而不是局部变化。我想有一些不同颜色的其他情节。请不要讨论绘图中的颜色太多…:-) 挖出

这是一个后续问题,讨论了轴、记号和标签的颜色。我希望可以为这个问题提出一个新的、扩展的问题

使用轴[ax1,ax2]更改双打印(通过
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中的fix
values()
)。@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"]]