Twinx / Secondary-y:不要以第一种颜色开始

时间:2018-06-05 13:13:32

标签: python matplotlib

我有一个来自

的配色方案
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颜色开始?

3 个答案:

答案 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()

enter image description here

答案 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]))

Plotting nothing to skip a colour

答案 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()

Example plot