我有一个来自
的配色方案plt.style.use('ggplot')
所以我不想手动选择颜色,或者从颜色循环器中挑选颜色。但是,当我有一个辅助轴时:
fig, ax = plt.subplots()
ax2 = ax.twinx()
ax.plot(np.array([1, 2]))
ax2.plot(np.array([3, 4]))
它将以相同的颜色绘制两条线。如何告诉ax2
该绘图上已经绘制了n=1
条线,以便它以n+1
颜色开始?
答案 0 :(得分:2)
遗憾的是,没有“推荐”方式来操纵循环器状态。请参阅Get matplotlib color cycle state上的一些深入讨论。
然而,您可以访问当前的循环仪并手动前进。
next(ax2._get_lines.prop_cycler)
完整代码:
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('ggplot')
fig, ax = plt.subplots()
ax2 = ax.twinx()
ax.plot(np.array([1, 2, 3]))
next(ax2._get_lines.prop_cycler)
ax2.plot(np.array([3, 5,4]))
plt.show()
答案 1 :(得分:1)
在绘制实际数据之前,您可以将空列表绘制到ax2
。这会导致循环中的第一种颜色用于绘制实际不存在的直线,然后移动到实际数据的第二种颜色。
plt.style.use("ggplot")
fig, ax = plt.subplots()
ax2 = ax.twinx()
ax.plot(np.array([1, 2]))
ax2.plot([]) # Plotting nothing.
ax2.plot(np.array([2, 1]))
答案 2 :(得分:1)
我认为按照other answer的建议在next()
上手动调用prop_cycler
有点容易出错,因为它很容易忘记。为了使过程自动化,您可以使两个轴共享同一个循环器:
ax2._get_lines.prop_cycler = ax1._get_lines.prop_cycler
是的,它仍然是一个丑陋的hack,因为它依赖于内部实现细节而不是定义的接口。但是,如果没有官方功能,这可能是最可靠的解决方案。如您所见,您可以按任意顺序在两个轴上添加图,而无需人工干预。
完整代码:
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('ggplot')
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax2._get_lines.prop_cycler = ax1._get_lines.prop_cycler
ax1.plot(np.array([1, 2, 3]))
ax2.plot(np.array([3, 5, 4]))
ax1.plot(np.array([0, 1, 3]))
ax2.plot(np.array([2, 4, 1]))
plt.show()