不同比例尺matplotlib中的多轴

2024-04-28 13:33:53 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在Matplotlib中实现多尺度?我指的不是一次轴和二次轴在同一个x轴上绘制,而是一些类似于许多趋势的东西,它们在同一个y轴上绘制了不同的比例,并且可以通过它们的颜色来识别。

例如,如果我有trend1 ([0,1,2,3,4])trend2 ([5000,6000,7000,8000,9000])要与时间相对绘制,并且希望这两个趋势具有不同的颜色和在Y轴上、不同的比例,那么我如何使用Matplotlib来实现这一点?

当我调查Matplotlib的时候,他们说他们现在还没有这个,尽管它肯定在他们的愿望列表上,有没有办法让它发生?

有没有其他的python绘图工具可以实现这一点?


Tags: 工具绘图列表matplotlib颜色时间绘制趋势
3条回答

如果您想用次Y轴快速绘制,那么使用Pandas包装器函数和两行代码就容易多了。只需绘制第一列,然后使用参数secondary_y=True绘制第二列,如下所示:

df.A.plot(label="Points", legend=True)
df.B.plot(secondary_y=True, label="Comments", legend=True)

如下所示:

enter image description here

你也没什么可做的了。看看Pandas plotting doc

如果我理解这个问题,您可能会对Matplotlib库中的this example感兴趣。

enter image description here

Yann上面的评论提供了一个类似的例子。


编辑-链接上方固定。从Matplotlib库复制的相应代码:

from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA
import matplotlib.pyplot as plt

host = host_subplot(111, axes_class=AA.Axes)
plt.subplots_adjust(right=0.75)

par1 = host.twinx()
par2 = host.twinx()

offset = 60
new_fixed_axis = par2.get_grid_helper().new_fixed_axis
par2.axis["right"] = new_fixed_axis(loc="right", axes=par2,
                                        offset=(offset, 0))

par2.axis["right"].toggle(all=True)

host.set_xlim(0, 2)
host.set_ylim(0, 2)

host.set_xlabel("Distance")
host.set_ylabel("Density")
par1.set_ylabel("Temperature")
par2.set_ylabel("Velocity")

p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density")
p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature")
p3, = par2.plot([0, 1, 2], [50, 30, 15], label="Velocity")

par1.set_ylim(0, 4)
par2.set_ylim(1, 65)

host.legend()

host.axis["left"].label.set_color(p1.get_color())
par1.axis["right"].label.set_color(p2.get_color())
par2.axis["right"].label.set_color(p3.get_color())

plt.draw()
plt.show()

#plt.savefig("Test")

由于Steve Tjoa's answer总是首先出现,而且当我在Google搜索多个y轴时,大多数情况下是孤独的,所以我决定添加一个稍微修改过的版本。这是来自this matplotlib example的方法。

原因:

  • 他的模块有时会在未知的环境和隐秘的实习错误中失败。
  • 我不喜欢加载我不知道的外来模块(mpl_toolkits.axisartistmpl_toolkits.axes_grid1)。
  • 下面的代码包含了人们经常遇到的问题(比如多轴的单个图例,使用viridis,…)的显式命令,而不是隐式行为。

Plot

import matplotlib.pyplot as plt 

fig = plt.figure()
host = fig.add_subplot(111)

par1 = host.twinx()
par2 = host.twinx()

host.set_xlim(0, 2)
host.set_ylim(0, 2)
par1.set_ylim(0, 4)
par2.set_ylim(1, 65)

host.set_xlabel("Distance")
host.set_ylabel("Density")
par1.set_ylabel("Temperature")
par2.set_ylabel("Velocity")

color1 = plt.cm.viridis(0)
color2 = plt.cm.viridis(0.5)
color3 = plt.cm.viridis(.9)

p1, = host.plot([0, 1, 2], [0, 1, 2], color=color1,label="Density")
p2, = par1.plot([0, 1, 2], [0, 3, 2], color=color2, label="Temperature")
p3, = par2.plot([0, 1, 2], [50, 30, 15], color=color3, label="Velocity")

lns = [p1, p2, p3]
host.legend(handles=lns, loc='best')

# right, left, top, bottom
par2.spines['right'].set_position(('outward', 60))      
# no x-ticks                 
par2.xaxis.set_ticks([])
# Sometimes handy, same for xaxis
#par2.yaxis.set_ticks_position('right')

host.yaxis.label.set_color(p1.get_color())
par1.yaxis.label.set_color(p2.get_color())
par2.yaxis.label.set_color(p3.get_color())

plt.savefig("pyplot_multiple_y-axis.png", bbox_inches='tight')

相关问题 更多 >