如何解决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
相关产品推荐
相关产品推荐

