两个具有相同轴或相同图形的matplotlib / pyplot直方图

时间:2015-10-05 14:40:36

标签: python matplotlib ipython data-visualization ipython-notebook

我有两个我想要制作的直方图有不同的分布。我想在旁边或彼此之上显示,但我不知道如何使用pyplot来做到这一点。如果我单独绘制它们,两个图的轴永远不会相同。我试图在ipython笔记本中这样做。这是一个例子。

import numpy as np
import pylab as P
%matplotlib inline
mu, sigma = 200, 25
x = mu + sigma*P.randn(10000)
n, bins, patches = P.hist(x, 50, normed=1, histtype='stepfilled')
mu2, sigma2 = 250, 45
x2 = mu2 + sigma2*P.randn(10000)
n2, bins2, patches2 = P.hist(x2, 50, normed=1, histtype='stepfilled')

此代码创建两个单独的图,每个图在生成时打印。是否可以保存这些图而不是打印它们,确定两个图中y和x范围的最大值/最小值是什么,然后调整每个图的范围以使它们具有可比性?我知道我可以使用P.ylim()和P.xlim()来设置/读取范围,但这似乎只是指最近创建的数字。

我也意识到分箱也可能会导致问题,所以我想我需要使用适用于这两个数字的分箱。

2 个答案:

答案 0 :(得分:2)

你的要求真的不清楚。我想这是因为你不完全理解matplotlib。所以这是一个快速演示。其余的,请阅读文档:http://matplotlib.org/

要在一个图中使用不同的图,您需要创建一个带有子图的图形对象。您需要导入matplotlib.pyplot才能完全轻松地访问matplotlib中的绘图工具。

以下是您修改后的代码:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline # only in a notebook

mu, sigma = 200, 25
x = mu + sigma*np.random.randn(10000)
fig, [ax1, ax2] = plt.subplots(1, 2)
n, bins, patches = ax1.hist(x, 50, normed=1, histtype='stepfilled')
mu2, sigma2 = 250, 45
x2 = mu2 + sigma2*np.random.randn(10000)
n2, bins2, patches2 = ax2.hist(x2, 50, normed=1, histtype='stepfilled')

所以我将P.randn更改为np.random.randn,因为我不再导入pylab了。

关键行如下:

fig, [ax1, ax2] = plt.subplots(1, 2)

我们创建一个名为fig的图形对象,其中包含2个Axes对象,名为ax1ax2。 Axes对象是绘制图形的位置。所以,在这里我们创建一个在网格上有2个轴的图形,其中包含1行和2行。你可以使用

fig, ax = plt.subplots(1, 2)

并致电ax[0]ax[1]

您可以通过调用以下方式获得2个图:

fig, ax = plt.subplots(2, 1)

然后你可以在给定的Ax中绘制你想要的直方图。它们会自动缩放。

因此,如果你想改变一个轴,比如说X轴,为两者设置相同的轴,你可以这样做:

ax_min = min(ax1.get_xlim()[0], ax2.get_xlim()[0]) # get minimum of lower bounds 
ax_max = max(ax1.get_xlim()[1], ax2.get_xlim()[1]) # get maximum of upper bounds

ax1.set_xlim(ax_min, ax_max)
ax2.set_xlim(ax_min, ax_max)

希望这有帮助

答案 1 :(得分:-1)

感谢ajay的评论,弄清楚了这个问题。我的问题是我有一个带有第一个绘​​图命令的ipython单元格和带有第二个绘图命令的第二个单元格。内联选项意味着在每个单元格运行后创建了一个绘图。如果我将两个绘图命令放入一个单元格中,它会创建一个包含两个直方图的图表。