如何使用matplotlib在一页上绘制多个图形?
我写了一段代码,可以一次打开16个图形。目前,它们都是作为独立的图表打开的。我希望它们能在同一页面上打开。不是同一个图表,而是希望在一个页面/窗口上有16个独立的图表。此外,出于某种原因,numbins和defaultreallimits的格式在第一个图形之后就不再保持了。我需要使用subplot命令吗?我不明白为什么我需要这样做,但又想不出其他办法。
import csv
import scipy.stats
import numpy
import matplotlib.pyplot as plt
for i in range(16):
plt.figure(i)
filename= easygui.fileopenbox(msg='Pdf distance 90m contour', title='select file', filetypes=['*.csv'], default='X:\\herring_schools\\')
alt_file=open(filename)
a=[]
for row in csv.DictReader(alt_file):
a.append(row['Dist_90m(nmi)'])
y= numpy.array(a, float)
relpdf=scipy.stats.relfreq(y, numbins=7, defaultreallimits=(-10,60))
bins = numpy.arange(-10,60,10)
print numpy.sum(relpdf[0])
print bins
patches=plt.bar(bins,relpdf[0], width=10, facecolor='black')
titlename= easygui.enterbox(msg='write graph title', title='', default='', strip=True, image=None, root=None)
plt.title(titlename)
plt.ylabel('Probability Density Function')
plt.xlabel('Distance from 90m Contour Line(nm)')
plt.ylim([0,1])
plt.show()
相关问题:
6 个回答
这个问题是四年前的,现在已经有了很多新东西。其中有一个新函数plt.subplots,非常方便:
fig, axes = plot.subplots(nrows=2, ncols=3, sharex=True, sharey=True)
在这里,axes是一个numpy.ndarray类型的对象,里面包含了多个AxesSubplot对象。这样一来,我们只需要用数组的索引[i,j]就能很方便地访问不同的子图。
来自las3rjock的回答,虽然被提问者接受了,但其实是错误的——代码无法运行,也不是有效的matplotlib语法;这个回答没有提供可以运行的代码,也没有给出任何对提问者有帮助的信息或建议,帮助他们自己写代码来解决问题。
既然这是被接受的答案,并且已经获得了几个赞,我觉得有必要对它进行一些拆解。
首先,调用subplot并不意味着你会得到多个图;subplot是用来创建单个图的,也可以用来创建多个图。此外,“改变plt.figure(i)”这个说法也是不正确的。
plt.figure()(其中plt或PLT通常是matplotlib的pyplot库,被导入并作为全局变量重新绑定,像这样:
from matplotlib import pyplot as PLT
fig = PLT.figure()
上面这一行创建了一个matplotlib图形实例;这个对象的add_subplot方法会被调用来为每个绘图窗口创建(非正式地想象一下,一个x轴和y轴组成一个单独的子图)。你可以这样创建(无论是一个还是多个在一页上):
fig.add_subplot(111)
这个语法等同于
fig.add_subplot(1,1,1)
选择一个对你来说有意义的。
下面我列出了在一页上绘制两个图的代码,一个在另一个上面。格式是通过传递给add_subplot的参数来完成的。注意第一个图的参数是(211),第二个图的参数是(212)。
from matplotlib import pyplot as PLT
fig = PLT.figure()
ax1 = fig.add_subplot(211)
ax1.plot([(1, 2), (3, 4)], [(4, 3), (2, 3)])
ax2 = fig.add_subplot(212)
ax2.plot([(7, 2), (5, 3)], [(1, 6), (9, 5)])
PLT.show()
这两个参数都是完整的规范,用于正确放置各自的图窗口在页面上。
211(同样,也可以用三元组的形式写作(2,1,1))意味着两行和一列的图窗口;第三个数字指定了这个特定子图窗口相对于其他子图窗口的顺序——在这种情况下,这是第一个图(所以它放在第一行),因此是图1,行1,列1。
第二次调用add_subplot时传递的参数,与第一次的唯一不同就是最后的数字(是2而不是1,因为这个图是第二个图,行2,列1)。
如果你想在一页上放四个图,以2x2的矩阵配置,你需要调用add_subplot方法四次,传入这四个参数(221),(222),(223),和(224),分别在10点、2点、8点和4点的位置创建四个图,按照这个顺序。
注意这四个参数的前两个数字都是2——这表示2 x 2的配置,也就是两行两列。
每个参数中的第三个(最右边的)数字编码了该特定图窗口在2 x 2矩阵中的顺序——也就是说,第一行第一列(1),第一行第二列(2),第二行第一列(3),第二行第二列(4)。
要回答你的主要问题,你需要使用 subplot 这个命令。我觉得把 plt.figure(i) 改成 plt.subplot(4,4,i+1) 应该就可以了。