Python& Matplotlib:创建两个不同大小的子图

时间:2014-01-16 11:47:02

标签: python matplotlib

我有一个创建一个或两个图表的脚本,具体取决于是否满足一个特定条件。基本上,到目前为止我所做的是以下内容:

import matplotlib.pyplot as plt

list1 = [1,2,3,4]
list2 = [4,3,2,1]
somecondition = True
plt.figure(1) #create one of the figures that must appear with the chart
ax = plt.subplot(211) #create the first subplot that will ALWAYS be there
ax.plot(list1) #populate the "main" subplot
if somecondition == True:
   ax = plt.subplot(212) #create the second subplot, that MIGHT be there
   ax.plot(list2) #populate the second subplot
plt.show()

这段代码(包含正确的数据,但我这样做的简单版本无论如何都是可执行的)会生成两个大小相同的子图,一个在另一个之上。但是,我想得到的是:

  • 如果某个条件 True ,则两个子图都应显示在图中。因此,我希望第二个子图比第一个子图小1/2;
  • 如果某个条件是 False ,那么只应出现第一个子图,我希望它的大小为全部图形(如果第二个子图不会出现,则不会留下空白区域) )。

我很确定这只是调整两个子图的大小,甚至可能是参数211和212(我不明白它们代表什么,因为我是Python的新手并且找不到网上有明确的解释)。有没有人知道如何以一种简单的方式调整子图的大小,与子图的数量以及图的整个大小成比例?为了便于理解,您还可以编辑我附加的简单代码以获得我正在寻找的结果吗?提前致谢!

2 个答案:

答案 0 :(得分:7)

这个解决方案满足吗?

import matplotlib.pyplot as plt

list1 = [1,2,3,4]
list2 = [4,3,2,1]
somecondition = True
plt.figure(1) #create one of the figures that must appear with the chart

if not somecondition:
    ax = plt.subplot(111) #create the first subplot that will ALWAYS be there
    ax.plot(list1) #populate the "main" subplot
else:
    ax = plt.subplot(211)
    ax.plot(list1)
    ax = plt.subplot(223) #create the second subplot, that MIGHT be there
    ax.plot(list2) #populate the second subplot
plt.show()

enter image description here

如果您需要相同宽度但半高,最好使用matplotlib.gridspec reference here

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

list1 = [1,2,3,4]
list2 = [4,3,2,1]
somecondition = True
plt.figure(1) #create one of the figures that must appear with the chart

gs = gridspec.GridSpec(3,1)

if not somecondition:
    ax = plt.subplot(gs[:,:]) #create the first subplot that will ALWAYS be there
    ax.plot(list1) #populate the "main" subplot
else:
    ax = plt.subplot(gs[:2, :])
    ax.plot(list1)
    ax = plt.subplot(gs[2, :]) #create the second subplot, that MIGHT be there
    ax.plot(list2) #populate the second subplot
plt.show()

enter image description here

答案 1 :(得分:5)

看来你正在寻找这个:

if somecondition:
    ax = plt.subplot(3,1,(1,2))
    ax.plot(list1)
    ax = plt.subplot(3,1,3)
    ax.plot(list2)
else:
    plt.plot(list1)

幻数是nrows,ncols,plot_number,见the documentation。因此3,1,3将创建3行,1列,并将绘制到第三个单元格中。其缩写为313

可以使用元组作为plot_number,因此您可以创建一个位于第一个和第二个单元格中的图:3,1,(1,2)