matplotlib colororder和twinx

时间:2014-06-18 08:04:44

标签: python matplotlib

我通过rcParams['axes.color_cycle'] = [some nice and carefully chosen colours]

调整了我的情节的色序

但是当我使用twinx作为第二个轴时,colororder被重置:

 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上绘制的线条应为黑色。

3 个答案:

答案 0 :(得分: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 - 循环可能看起来有点笨拙。但是,它会使第二轴的颜色周期增加第一轴上已有的行数。这是通过致电next()
  • 上的ax1._get_lines.color_cycle来完成的
  • 您实际上并不需要循环计数器advance,但是,它使代码更具可读性。
  • 现在,第二个轴上的任何线条将在您在第一个轴上离开的那个之后继续循环中的下一个颜色。
  • 如果你想回到第一个轴,你也必须计算ax1上的行数。

在此上下文中要阅读的一个有趣问题是:Get Matplotlib Color Cycle State

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

正如a more recent answerGet Matplotlib Color Cycle State中所讨论的那样,matplotlib 1.5已经改变了与新的,更通用的“属性循环”功能相关的颜色循环。 Schorsch的答案中的关键命令现在必须是next(ax1._get_lines.prop_cycler)

策略仍然涉及到幕后,所以不保证在未来的版本中也不会破坏。