Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Twinx/Secondary-y:不要以第一种颜色开始_Python_Matplotlib - Fatal编程技术网

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。我用任何版本的答案更新了答案。