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+1th 颜色开头?

【问题讨论】:

"我如何告诉 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开始说起

C#如何从第二种形式创建第一种形式的对象

乌鲁木齐icpc2017网络赛DI题

算法:插入排序详解--为什么从第二项开始,而不是第一项

需要一种方法来使用实体框架核心中的C#Linq从第二个表中检索数据

JN 刷墙 过程DP