matplotlib 如何用子图改变图形的大小

wqlqzqxt  于 2023-05-18  发布在  其他
关注(0)|答案(2)|浏览(154)

我在使用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()

fd3cxomn

fd3cxomn1#

您可以删除初始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()
jdg4fx2g

jdg4fx2g2#

图形大小以英寸为单位。如果由于某种原因,在打印后需要更改子图的图形大小(可能是因为它的创建是由外部库,如statsmodels等处理的),那么您可以在图形对象上调用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)

相关问题