如何控制具有不同图例大小的绘图大小 matplotlib

问题描述 投票:0回答:1

我想要 2 个相同大小的地块。图形的大小并不那么重要。 我所做的唯一改变是标签的长度。 (实际上我有2个相关的数据集)

长标签会导致绘图变形。我怎样才能避免这种情况?我需要 2 个连贯的情节。


import numpy as np
from matplotlib import pyplot as plt

def my_plot(x,ys,labels, size = (5.75, 3.2)):
    fig, ax1 = plt.subplots(nrows=1, ncols=1, sharex=True,  
                            figsize=size,
                            dpi = 300)

    ax1.plot(x, ys[0], label = labels[0])
    ax1.plot(x, ys[1], label = labels[1])

    ## Add ticks, axis labels and title
    ax1.set_xlim(0,21.1)
    ax1.set_ylim(-50,50)
    ax1.tick_params(axis='both', which='major', labelsize=18)
    ax1.set_xlabel('Time', size = 18)
    ax1.set_ylabel('Angle', size = 18)

    ## Add legend outside the plot
    ax1.legend(ncol=1, bbox_to_anchor=(1, 0.5), loc='center left', edgecolor='w')
    

# Dummy data
x1 = np.arange(0, 24, 0.1)
y1_1 = np.sin(x1)*45
y1_2 = np.cos(x1)*25

my_plot(x1, [y1_1, y1_2], ["sin", "cos", "tan"])
my_plot(x1, [y1_1, y1_2], ["long_sin", "long_cos", "long_tan"])

产生以下两个图:

short labels long labels

我已经尝试过:

  • plt.tight_layout()
  • ax1.set_aspect(0.1)
  • 更改子图的大小 - 这几乎解决了问题,但不完全是,因为所有有效字体大小都发生了变化。
python numpy matplotlib plot figure
1个回答
0
投票

这可以通过 matplotlib GridSpec 来实现:

from matplotlib.gridspec import GridSpec

通过为子图创建网格,您可以控制大小。布局是一个两行两列的网格。为图例/标签保留一列,这样它们就不会干扰主图的大小。

fig = plt.figure(figsize=(10, 8), dpi=100)
gs = GridSpec(2, 2, width_ratios=[1, 0.3], height_ratios=[1, 1], wspace=0.3, hspace=0.4)

# First plot (Top)
ax1 = fig.add_subplot(gs[0, 0])
my_plot(ax1, x1, [y1_1, y1_2], ["sin", "cos"])

# Second plot (Bottom) with longer labels
ax2 = fig.add_subplot(gs[1, 0])
my_plot(ax2, x1, [y1_1, y1_2], ["long_sine_label", "long_cosine_label"])

Subplots same size, different label lengths

© www.soinside.com 2019 - 2024. All rights reserved.