matplotlib colororder 和 twinx

Posted

技术标签:

【中文标题】matplotlib colororder 和 twinx【英文标题】:matplotlib colororder and twinx 【发布时间】:2014-06-18 08:04:44 【问题描述】:

我通过rcParams['axes.color_cycle'] = [some nice and carefully chosen colours]调整了我的情节的颜色顺序

但是当我将 twinx 用于第二个轴时,颜色顺序会被重置:

 from matplotlib import pyplot as plt
 from matplotlib import rcParams
 rcParams['axes.color_cycle'] = ['r','g','k']
 fig = plt.figure()
 ax = fig.add_subplot(1,1,1)
 ax1 = plt.twinx(ax) 
 ax.plot([1,2,3],[4,5,6])
 ax.plot([1,2,3],[7,6,4])
 ax1.plot([1,2,3],[5,3,1])

有没有办法绕过它? ax1 上绘制的线应该是黑色的。

【问题讨论】:

【参考方案1】:

您实际上可以对两个轴使用单个颜色循环器,而不是推进第二个轴的颜色循环器(如其他答案中所建议):

fig, ax1 = plt.subplots()
ax1.plot(...)

ax2 = ax1.twinx()
ax2._get_lines.prop_cycler = ax1._get_lines.prop_cycler
ax2.plot(...)

【讨论】:

【参考方案2】:

正如 a more recent answer 到 Get Matplotlib Color Cycle State 中所讨论的,在 matplotlib 1.5 中,颜色循环发生了变化,与一个新的、更通用的“属性循环”功能相关。 Schorsch 答案中的关键命令现在必须是 next(ax1._get_lines.prop_cycler)

该策略仍然涉及在幕后四处寻找,因此不能保证这在未来的版本中也不会中断。

【讨论】:

【参考方案3】:

这是一种提高第二轴颜色顺序的方法。

from matplotlib import pyplot as plt
from matplotlib import rcParams

rcParams['axes.color_cycle'] = ['r','g','k']
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax1 = plt.twinx(ax) 

line = []

line.append(ax.plot([1,2,3],[4,5,6])[0])
line.append(ax.plot([1,2,3],[7,6,4])[0])

for advance in range(len(line)):
    ax1._get_lines.color_cycle.next()

ax1.plot([1,2,3],[5,3,1])

如果您运行此示例,第二个轴上的线将为黑色。


会发生什么:

line 中,您可以跟踪在第一个轴上绘制的线数。请注意,您只需要附加matplotlib.lines.Line2D object 的第一个条目,因此[0]ax.plot([1,2,3],[4,5,6]) 的末尾 for-loop 可能看起来有点笨拙。但是,它会通过您在第一个轴上已有的线数来推进您的第二个轴的颜色循环。这是通过在ax1._get_lines.color_cycle 上调用next() 来完成的 您实际上不需要循环计数器advance,但是,它使代码更具可读性。 现在,第二个轴上的任何线条都将在您在第一个轴上停止使用的颜色之后的循环中继续使用下一种颜色。 如果你想回到第一个轴,你也必须计算ax1 上的行数。

在这种情况下要阅读的一个有趣问题是:Get Matplotlib Color Cycle State

【讨论】:

不客气!感谢您在问题中提供了一个很好的最小工作示例!

以上是关于matplotlib colororder 和 twinx的主要内容,如果未能解决你的问题,请参考以下文章

python数据分析工具包——matplotlib

用matplotlib画散点图

matplotlib简介

Matplotlib的'Float'错误

Python中用matplotlib.pyplot画图总结

matplotlib绘图2