matplotlib:具有不同比例尺的叠加图? [英] matplotlib: overlay plots with different scales?
问题描述
到目前为止,我有以下代码:
So far I have the following code:
colors = ('k','r','b')
ax = []
for i in range(3):
ax.append(plt.axes())
plt.plot(datamatrix[:,0],datamatrix[:,i],colors[i]+'o')
ax[i].set(autoscale_on=True)
使用每个轴的autoscale_on=True
选项,我认为每个图应具有其自己的y轴限制,但看起来它们共享相同的值(即使它们共享不同的轴).如何设置它们的缩放比例以显示每个datamatrix[:,i]
的范围(只是对.set_ylim()
的显式调用?)而且,如何为第三个变量(datamatrix[:,2]
)创建偏移y轴,需要以上吗?谢谢大家.
With the autoscale_on=True
option for each axis, I thought each plot should have its own y-axis limits, but it appears they all share the same value (even if they share different axes). How do I set them to scale to show the range of each datamatrix[:,i]
(just an explicit call to .set_ylim()
?) And also, how can I create an offset y-axis for the third variable (datamatrix[:,2]
) that might be required above? Thanks all.
推荐答案
听起来您想要的是子图...您现在正在做的事情没有多大意义(或者我对此感到非常困惑您的代码段,无论如何...).
It sounds like what you're wanting is subplots... What you're doing now doesn't make much sense (Or I'm very confused by your code snippet, at any rate...).
尝试更多类似的方法:
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(nrows=3)
colors = ('k', 'r', 'b')
for ax, color in zip(axes, colors):
data = np.random.random(1) * np.random.random(10)
ax.plot(data, marker='o', linestyle='none', color=color)
plt.show()
如果您不想要子图,那么您的代码段就更有意义了.
If you don't want subplots, your code snippet makes a lot more sense.
您正在尝试在彼此的正上方添加三个轴. Matplotlib正在认识到图中的大小和位置已经存在一个子图,因此每次都会返回 same 轴对象.换句话说,如果您查看列表ax
,您会发现它们都是同一对象.
You're trying to add three axes right on top of each other. Matplotlib is recognizing that there's already a subplot in that exactly size and location on the figure, and so it's returning the same axes object each time. In other words, if you look at your list ax
, you'll see that they're all the same object.
如果您真的要这样做,则每次添加轴时都需要将fig._seen
重置为空字典.但是,您可能真的不想这样做.
If you really want to do that, you'll need to reset fig._seen
to an empty dict each time you add an axes. You probably don't really want to do that, however.
而不是彼此放置三个独立的图,而是看看使用twinx
.
Instead of putting three independent plots over each other, have a look at using twinx
instead.
例如
import matplotlib.pyplot as plt
import numpy as np
# To make things reproducible...
np.random.seed(1977)
fig, ax = plt.subplots()
# Twin the x-axis twice to make independent y-axes.
axes = [ax, ax.twinx(), ax.twinx()]
# Make some space on the right side for the extra y-axis.
fig.subplots_adjust(right=0.75)
# Move the last y-axis spine over to the right by 20% of the width of the axes
axes[-1].spines['right'].set_position(('axes', 1.2))
# To make the border of the right-most axis visible, we need to turn the frame
# on. This hides the other plots, however, so we need to turn its fill off.
axes[-1].set_frame_on(True)
axes[-1].patch.set_visible(False)
# And finally we get to plot things...
colors = ('Green', 'Red', 'Blue')
for ax, color in zip(axes, colors):
data = np.random.random(1) * np.random.random(10)
ax.plot(data, marker='o', linestyle='none', color=color)
ax.set_ylabel('%s Thing' % color, color=color)
ax.tick_params(axis='y', colors=color)
axes[0].set_xlabel('X-axis')
plt.show()
这篇关于matplotlib:具有不同比例尺的叠加图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!