You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Streamlit中matplotlib subplot绘制图像被拉伸变形的问题

你遇到的拉伸问题是Streamlit的st.pyplot默认参数导致的:该方法默认use_container_width=True,会强制把Matplotlib生成的画布拉伸适配当前页面容器的宽度,覆盖你在plt.figure(figsize=xxx)中设定的固定尺寸。

解决方法

方法1:直接关闭自动适配

调用st.pyplot时添加use_container_width=False参数,即可保留你设置的画布原始尺寸,效果和本地Jupyter/原生Python运行完全一致。
修改后的完整代码:

import streamlit as st
import numpy as np
import matplotlib.pyplot as plt

imgs = [np.random.random((50,50)) for _ in range(4)]

fig1 = plt.figure(figsize = (3,3))
plt.subplot(2, 2, 1);
plt.imshow(imgs[0]);
plt.axis('off');
plt.subplot(2, 2, 2);
plt.imshow(imgs[1]);
plt.axis('off');
plt.subplot(2, 2, 3);
plt.imshow(imgs[2]);
plt.axis('off');
plt.subplot(2, 2, 4);
plt.imshow(imgs[3]);
plt.axis('off');
plt.subplots_adjust(wspace=.025, hspace=.025)
# 关闭自动适配容器宽度
st.pyplot(fig1, use_container_width=False)

fig2 = plt.figure(figsize = (3,3))
plt.subplot(2, 2, 1);
plt.imshow(imgs[0]);
plt.axis('off');
# 关闭自动适配容器宽度
st.pyplot(fig2, use_container_width=False)

方法2:保留布局空位(可选)

如果你希望2×2布局只绘制单张图时,其余位置保持空白、不出现布局偏移,可以把未使用的子图设为隐藏:

fig2 = plt.figure(figsize = (3,3))
plt.subplot(2, 2, 1);
plt.imshow(imgs[0]);
plt.axis('off');
# 隐藏其余未绘图的子图,保持2×2布局结构不变
for idx in [2,3,4]:
    ax = plt.subplot(2,2,idx)
    ax.set_visible(False)
st.pyplot(fig2, use_container_width=False)

内容的提问来源于stack exchange,提问作者Michael D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:36:03