Python Twinx/Secondary-y:不要以第一种颜色开始
我有一个来自中国的配色方案Python Twinx/Secondary-y:不要以第一种颜色开始,python,matplotlib,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+1th颜色开始?不幸的是,没有“推荐”的方法来操纵循环器状态。
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
th颜色开始?不幸的是,没有“推荐”的方法来操纵循环器状态。请参阅上的一些深入讨论
但是,您可以访问当前循环器并手动将其推进
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()
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()
在打印实际数据之前,可以将空列表打印到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]))
我认为,按照中的建议,手动调用
prop\u cycler
上的next()
有点容易出错,因为很容易忘记。为了使该过程自动化,可以使两个轴共享同一个循环器:
ax2._get_lines.prop_cycler = ax1._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()
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()
“我如何告诉ax2在该轴上已经画了n=1条线”ax2上还没有画线,所以它选择了颜色循环的第一种颜色。.next()
对我不起作用,但是ax2。\u get\u lines.prop\u cycler。\uu next\uu()
有。很好的一点,.next()
只是python 2。我用任何版本的答案更新了答案。