Twinx/Secondary-y:不要从第一种颜色开始
Posted
技术标签:
【中文标题】Twinx/Secondary-y:不要从第一种颜色开始【英文标题】:Twinx/Secondary-y: Do not start with first color 【发布时间】:2018-06-05 13:13:32 【问题描述】:我有一个来自
的配色方案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 颜色开头?
【问题讨论】:
"我如何告诉 ax2 在那个轴上已经画了 n=1 条线"ax2
上还没有画线,所以它选择了第一个颜色循环的颜色。
【参考方案1】:
我认为按照other answer 中的建议在prop_cycler
上手动调用next()
有点容易出错,因为它很容易忘记。为了使过程自动化,您可以使两个轴共享同一个循环仪:
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()
【讨论】:
【参考方案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()
【讨论】:
.next()
对我不起作用,但 ax2._get_lines.prop_cycler.__next__()
可以。
好点,.next()
仅适用于 python 2。我用任何版本的有效方法更新了答案。【参考方案3】:
您可以在绘制实际数据之前绘制一个空列表到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]))
【讨论】:
以上是关于Twinx/Secondary-y:不要从第一种颜色开始的主要内容,如果未能解决你的问题,请参考以下文章
在主动要求涨工资这事上,不要学我!从第一份工资800开始说起