如何通过子图更改图形的大小

43

我在尝试使用plt.subplots时遇到了一些问题,无法更改图形大小。使用以下代码,我只能得到标准大小的图形,所有子图都挤在一起(大约有100个),显然只是一个额外的空图形大小。我尝试使用tight_layout,但没有成功。

def plot(reader):
    channels=[]
    for i in reader:
        channels.append(i)

    plt.figure(figsize=(50,100))
    fig, ax = plt.subplots(len(channels), sharex=True)
    
    plot=0    
    for j in reader: 
        
        ax[plot].plot(reader["%s" % j])
        plot=plot+1

    plt.tight_layout()
    plt.show()

enter image description here


1
你为什么构建了 channels 列表,但从未使用它?此外,你对 readerfor 循环是 enumerate 的完美用例。例如:for plot, j in enumerate(reader): - wflynny
我使用通道列表来确定有多少个子图。感谢您关于enumerate的提示。 - Ashleigh Clayton
1
еҰӮжһңжӮЁж— жі•жү§иЎҢlen(reader)жҲ–len(list(reader))пјҢжӮЁеҸҜд»Ҙе§Ӣз»Ҳжү§иЎҢN_channels = len([1 for _ in channels])пјҢеӣ дёәжӮЁдёҚйңҖиҰҒеӯҳеӮЁreaderзҡ„е®һйҷ…еҶ…е®№гҖӮ - wflynny
子图文档:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplots.html - nycynik
2个回答

69
你可以删除你最初的plt.figure()。调用plt.subplots()时会创建一个新的图形,因此你的第一个调用不会有任何作用。
在后台,subplots命令将为您调用plt.figure(),并传递任何关键字。所以只需在subplots()命令中添加figsize关键字:
def plot(reader):
    channels=[]
    for i in reader:
        channels.append(i)

    fig, ax = plt.subplots(len(channels), sharex=True, figsize=(50,100))

    plot=0    
    for j in reader: 

        ax[plot].plot(reader["%s" % j])
        plot=plot+1

    plt.tight_layout()
    plt.show()

1
谢谢,figsize=(50,100) 是我在这里的目的。 - arilwan

1

图形大小以英寸为单位。如果由于某种原因,子图的figsize需要在绘制后更改(可能是因为它的创建由外部库(如statsmodels等)处理),那么您可以调用figure对象上的set_size_inches()来设置图形大小。

fig.set_size_inches(50, 100)
# or 
plt.gcf().set_size_inches(50, 100)

一个工作示例:
import random
def subplots():
    xs = [[range(3)]*2]*2
    ys = [[[random.random() for _ in range(3)] for _ in range(2)] for _ in range(2)]
    fig, axs = plt.subplots(2,2)
    for i, row in enumerate(zip(xs, ys)):
        for j, (x, y) in enumerate(row):
            axs[i][j].plot(x, y)

subplots()                          # draw subplots
plt.gcf().set_size_inches(15,5)     # set figure size afterwards

另一个例子是使用statsmodels处理时间序列分解图。如果在绘制后不设置图像大小,则结果图太小:

import random, pandas as pd
from statsmodels.tsa.seasonal import seasonal_decompose

data = pd.Series([random.random() for _ in range(100)], index=pd.date_range('2020', periods=100, freq='D'))
decomp = seasonal_decompose(data)
fig = decomp.plot()
fig.set_size_inches(10,10)
#   ^^^^^^^^^^^^^^^       <---- set figure size to (10, 10)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接