matplotlib 颜色顺序与双y轴

4 投票
3 回答
3351 浏览
提问于 2025-04-18 10:11

我通过 rcParams['axes.color_cycle'] = [一些好看且精心挑选的颜色] 调整了我的图表的颜色顺序。

但是,当我使用 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 上绘制的线应该是黑色的。

3 个回答

4

一个较新的回答中提到,关于获取Matplotlib颜色循环状态的问题,Matplotlib 1.5版本对颜色循环做了一些改动,引入了一个新的、更通用的“属性循环”功能。现在,Schorsch的回答中关键的命令需要改成next(ax1._get_lines.prop_cycler)

这个方法还是需要在后台进行一些操作,所以不能保证在未来的版本中不会出问题。

14

与其他回答中提到的让第二个坐标轴的颜色循环器向前移动不同,其实你可以为两个坐标轴使用一个颜色循环器:

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

ax2 = ax1.twinx()
ax2._get_lines.prop_cycler = ax1._get_lines.prop_cycler
ax2.plot(...)
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 对象 的第一个条目,所以在 ax.plot([1,2,3],[4,5,6]) 末尾有个 [0]
  • 这个 for 循环可能看起来有点笨拙。不过,它通过你在第一个坐标轴上已经绘制的线条数量来推进第二个坐标轴的颜色循环。这是通过调用 next() 来实现的,作用于 ax1._get_lines.color_cycle
  • 其实你并不需要循环计数器 advance,不过它让代码更容易理解。
  • 现在,第二个坐标轴上的任何线条都会在你在第一个坐标轴上停下的颜色之后,继续使用颜色循环中的下一个颜色。
  • 如果你想回到第一个坐标轴,你也需要计算 ax1 上的线条数量。

在这个背景下,有一个有趣的问题可以阅读: 获取 Matplotlib 颜色循环状态

撰写回答