matplotlib:具有不同比例尺的叠加图? [英] matplotlib: overlay plots with different scales?

查看:180
本文介绍了matplotlib:具有不同比例尺的叠加图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

到目前为止,我有以下代码:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆