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

Foo*_*Bar 4 python matplotlib

我有一个配色方案来自

plt.style.use('ggplot')
Run Code Online (Sandbox Code Playgroud)

所以我不想手动选择颜色,或者从颜色循环器中选择它们。但是,当我有一个辅助轴时:

fig, ax = plt.subplots()
ax2 = ax.twinx()
ax.plot(np.array([1, 2]))
ax2.plot(np.array([3, 4]))
Run Code Online (Sandbox Code Playgroud)

它将以相同的颜色绘制两条线。我如何判断ax2该图上已经n=1绘制了线条,以便它以第n+1th 种颜色开头?

Fri*_*itz 6

我觉得手动调用next()prop_cycler作为建议对方的回答是有点容易出错,因为它很容易忘记。为了使该过程自动化,您可以使两个轴共享同一个循环仪:

ax2._get_lines.prop_cycler = ax1._get_lines.prop_cycler
Run Code Online (Sandbox Code Playgroud)

是的,它仍然是一个丑陋的黑客,因为它取决于内部实现细节而不是定义的接口。但是在没有官方功能的情况下,这可能是最强大的解决方案。如您所见,您可以按任意顺序在两个轴上添加绘图,无需人工干预。

完整代码:

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()
Run Code Online (Sandbox Code Playgroud)

示例图