如何使用 matplotlib 调整子图中的图形大小

Posted

技术标签:

【中文标题】如何使用 matplotlib 调整子图中的图形大小【英文标题】:how to resize figures within a subplot using matplotlib 【发布时间】:2015-04-01 11:58:21 【问题描述】:

我正在尝试调整子图中的两个数字的大小。基本上,我想要一个温度曲线为 111,压力曲线为 211 的子图。但是,我希望压力数字小于温度数字。如果没有相当复杂的 gridspec 库,这可能吗?我有以下代码:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# ------Pressure------#

df1 = pd.DataFrame.from_csv('Pressure1.csv',index_col = None)
df1['P'] = df1['P'].str.split('.').str[:-1].str.join(',').str.replace(',', '.').astype(np.float64)
a = df1['T']
a /= 2900 # Convert milliseconds to hours
initial_time = 0
a += initial_time - min(a)
b = df1['P']
b -=+1 #convert from volts to bar

# ------- Temperature----------#

df = pd.DataFrame.from_csv('Temperature1.csv',index_col = None)

w = df['Time']
w /= 3600000 # Convert milliseconds to hours
initial_time = 0
w += initial_time - min(w)

x = df['Input 1']
y = df['Input 2']
z = df['Input 3']

#----subplot----#

plt.subplot(1,1,1)
figsize(20,10)
plt.plot(w,x, label = "Top_sensor")
plt.plot(w,y, label = "Mid_sensor")
plt.plot(w,z, label = 'Bot_sensor')
plt.title('Temperature')
plt.xlabel('Time(Hours)')
plt.ylabel('Temperature (K)')
plt.ylim(70, 200)
plt.xlim(0, 12, 1)
plt.show()

plt.subplot(2,1,1)
figsize(20,3)
plt.plot(a,b)
plt.title('Pressure_Monitoring')
plt.xlabel('Time(Hours)')
plt.ylabel('Pressure (Bar)')
plt.xlim(0, 12, 1)
plt.show()

查看我如何尝试更改每个子图中的 figsize。这是错误的方式吗?

好的,所以我已经设法获得了我想要的 gridspec。但是,我如何将两者结合起来?

import matplotlib.gridspec as gridspec

f = plt.figure()

gs = gridspec.GridSpec(2, 1,width_ratios=[20,10], height_ratios=[10,5])

ax1 = plt.subplot(gs[0])
ax2 = plt.subplot(gs[1])

plt.show()

【问题讨论】:

试试ax1 = plt.subplot(gs[0, :])ax2 = plt.subplot(gs[1, :]) 在使用自己的数据集时如何使用 ax1 和 ax2? plt.set_axes(ax1)plt.set_axes(ax2)? plt.axes(ax1) 工作 :) 谢谢。 【参考方案1】:

试试:

ax1 = plt.subplot(gs[0, :])
ax2 = plt.subplot(gs[1, :])

然后像这样设置你的轴:

plt.axes(ax1) 

【讨论】:

实际上对ax1ax2 进行阴谋不是更好吗? (即 ax.plot(...) @PaulH 是的,我同意你的看法。我也同意你在回复中所说的,pyplot 没有提供一个很好的界面,这会导致简单绘图过于复杂,并在如何配置相同的简单绘图时插入太多歧义。 正如@PaulH 所说,在这种情况下,OO 接口更易于使用。虽然这并没有错误,但我很想投反对票,因为这是不好的做法。【参考方案2】:

这就是pyplot 接口如此糟糕的原因。这比它需要的复杂得多。

加载并准备您的数据。那么:

fig = plt.Figure(figsize=(20, 3))
gs = gridspec.GridSpec(2, 1, width_ratios=[20,10], height_ratios=[10,5])
ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1])

ax1.plot(...)
ax1.set_ylabel(...)
...

ax2.plot(...)
ax2.set_xlabel(...)

这样,您不必创建任何没有真正使用的无关对象,并且始终明确指出正在修改哪些轴。

【讨论】:

确实比 pyplot 更好的界面!但是,当我尝试运行上面的代码时,出现了两个错误。 1) plt.Figure 应该小写 plt.figure 2) 对于 2x1 网格,宽度应该定义为单个值列表,因为只有一个宽度可以设置,所以 width_ratios=[20]

以上是关于如何使用 matplotlib 调整子图中的图形大小的主要内容,如果未能解决你的问题,请参考以下文章

使用大数据集进行 Matplotlib 图形调整 [关闭]

Matplotlib 不同大小的子图

matplotlib - 子图中的 twinx 轴没有 xlabel 和 xticks

如何调整我的 Plotly 条高度并仅显示条的边缘(在子图中)?

Matplotlib 使用GridSpec和其他功能自定义图形布局

子图中的分页符?多个页面上的 Matplotlib 子图