在matplotlib中创建具有不同形状的子图

时间:2012-11-22 06:56:51

标签: python matplotlib subplot

meteogram

我正在寻找创建一个包含多个子图的图形,就像matplotlib中的这个图表一样。我将需要多个不同高度的子图(所有相同的宽度,但有些将是“更瘦”,有些将是“更胖”)。就像上面的图像一样,一些子图需要很大,一些需要很小,但是它们需要足够大以传达有用的信息,无论有多少子图。

当我创建一个子图作为pyplot.subplot(2,1,1)时,它具有我需要的纵横比,但如果我增加行数(例如子图(3,1,1)),则子图变为“太瘦”。我需要在一个图上放置这些图中的六个,但如果我开始在图上插入更多的子图,它们就会变得太“小”。

简单地说,这是一个像matplotlib这样的气象图可能没有拼接多个图像?这些图像将通过网址请求从服务器返回,因此从技术上来说这是可能的,但如果我可以在库中解决这个问题,那将是首选。

matplotlib的文档非常棒,但似乎matplotlib被调整为给出具有相同宽高比的子图,而不是随着子图的数量增加而给出具有任意宽高比的子图。我在网上找不到不同子图大小的单个例子。

2 个答案:

答案 0 :(得分:6)

您可以通过在标准化坐标(构造中)中设置边界框来完全控制轴定位。格式为[left,top,width,height]。

我将如何设置图形的示例:

import matplotlib.pyplot as plt


left = 0.1
width = 0.8

ax1 = plt.axes([left, 0.5, width, 0.45])
ax2 = plt.axes([left, 0.3, width, 0.19])
ax3 = plt.axes([left, 0.2, width, 0.09], sharex=ax2)
ax4 = plt.axes([left, 0.1, width, 0.09], sharex=ax2)

# ticks at the top of the top plot
ax1.xaxis.tick_top()

# remove ticks for ax2 and ax3
ax2.xaxis.set_visible(False)
ax3.xaxis.set_visible(False)

# only put ticks on the bottom of ax4
ax4.xaxis.tick_bottom()

plt.show()

我添加了一些您可能会觉得有用的功能(删除顶部刻度,共享x轴,将刻度移动到Axes顶部)。

结果:

Example output

HTH

答案 1 :(得分:3)

您可以使用Gridspecsubplot2grid。我发现后者使用起来更自然,但这是个人喜好。此外,Pelson的回答是另一种方法。

查看this example中最底部的两个代码块。