Linux GCP终端运行py脚本时plt.show()无法显示图表如何解决
问题原因
GCP 提供的默认 Linux 实例不带图形桌面环境,Matplotlib 默认加载依赖 GUI 窗口的渲染后端,执行plt.show()时无法调用图形接口弹出窗口,根据你的使用场景选择对应配置即可:
方案1:无桌面环境通用方案(推荐,无需额外GUI依赖)
如果不需要实时弹窗交互,仅需获取绘制好的图表,直接指定无GUI的Agg后端,将图表导出为本地图片文件即可,后续所有绘图代码都可以沿用这个配置,兼容性最好。
- 第一步:在导入
matplotlib.pyplot之前,先指定Agg后端 - 第二步:将原代码的
plt.show()替换为文件保存接口,指定图片输出路径
修改后的代码参考:
import matplotlib # 提前指定无GUI后端,必须放在pyplot导入之前 matplotlib.use('Agg') import numpy as np import pandas as pd import scipy.stats as stats from scipy.stats import norm import matplotlib.pyplot as plt def moving_average(d, extra_periods=1, n=3): #historical period length cols = len(d) #append null values to account for future forecast d = np.append(d, [np.nan]*extra_periods) # define a forecast array f = np.full(cols+extra_periods, np.nan) #create all the t+1 forecast until end of historical period for t in range(n, cols): f[t] = np.mean(d[t-n:t]) #forecast all the extra periods f[t+1:]=np.mean(d[t-n+1:t+1]) #return dataframe df = pd.DataFrame.from_dict({'Demand':d, 'Forecast':f, 'Error':d-f}) return df d = [28,19,18,13,19,16,19,18,13,16,16,11,18,15,13,15,13,11,13,10,12] df = moving_average(d, extra_periods=4,n=3) df[['Demand','Forecast']].plot() # 保存图片到当前脚本目录,dpi控制清晰度,bbox_inches防止边缘标签被截断 plt.savefig('./demand_forecast.png', dpi=300, bbox_inches='tight')
运行脚本后会在当前目录生成demand_forecast.png文件,将文件下载到本地设备即可查看。
方案2:需要实时弹出交互式图表窗口
如果需要运行脚本时直接弹出可交互的图窗,通过X11转发将服务器端的图形界面映射到本地桌面即可:
- 本地设备前置配置:Windows系统安装并启动VcXsrv/Xming;macOS系统安装并启动XQuartz;本地Linux系统无需额外配置,默认自带X服务
- SSH连接GCP实例时添加X11转发参数:
gcloud compute ssh 你的实例名称 -- -X - 实例内安装GUI依赖(以Debian/Ubuntu系统为例):
sudo apt update && sudo apt install python3-tk tk-dev -y pip install --upgrade matplotlib - 连接后执行
echo $DISPLAY确认输出不为空,如果为空则手动执行export DISPLAY=localhost:10.0,再直接运行原脚本,图窗会自动转发到本地桌面显示。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

