【错误及解决】Linux终端无GUI调用matplotlib绘图问题解决

569 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、问题描述

采用Xshell连接linux服务器,然后调用matplotlib作图,由于没有GUI所以无法直接展示,因此想把图像保存下来,然后下载到本地查看。查询网上给出的有效方案如下:

import matplotlib
matplotlib.use("Agg")  #这一句一定要放在下面这句的前面
 
import matplotlib.pyplot as plt

但是 我按照这个方法写成如下,依然无法达到预期效果,会报错显示x11转发请求,总之就是不能正常保存图片

import os
import numpy as np
from Config import Config
import net
from keras.utils import to_categorical
from keras.callbacks import ModelCheckpoint, LearningRateScheduler
import mit_utils as utils
import time
from keras.models import load_model


os.environ["TF_CPP_MIN_LOG_LEVEL"] = '2'
os.environ["CUDA_VISIBLE_DEVICES"] = '3'
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session

import matplotlib
matplotlib.use("Agg")
 
import matplotlib.pyplot as plt



###中间省略N行代码
#*******************************
history = model.fit(x=TrainXt, y=TrainYt, batch_size=modelconfig.batch_size, epochs=3,
              verbose=1, validation_data=(ValXt, ValYt), callbacks=callback_lists)
plt.plot(history.history['categorical_accuracy'], marker='.')
plt.plot(history.history['val_categorical_accuracy'], marker='.')
plt.title('model accuracy')
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.grid()
plt.legend(['categorical_accuracy', 'val_categorical_accuracy'], loc='lower right')
plt.savefig(os.path.join(result_dir, 'model_accuracy.png'))
plt.close()

plt.plot(history.history['loss'], marker='.')
plt.plot(history.history['val_loss'], marker='.')
plt.title('model loss')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.grid()
plt.legend(['loss', 'val_loss'], loc='upper right')
plt.savefig(os.path.join(result_dir, 'model_loss.png'))
plt.close()

然后就会出现如下弹框报错提示。。。。 在这里插入图片描述

二、解决方案

我又查了很多方法,几乎都是开篇提出的那种,所以考虑是否是语句整体的位置不对,试了很多次,最终发现把matplotlib的调用放在最前面就可以了~~~~ 不过我并不知道是什么原理,如果有大佬晓得,请在评论区指点一下呀!

改后的代码如下所示:

import matplotlib
matplotlib.use("Agg")
 
import matplotlib.pyplot as plt

import os
import numpy as np
from Config import Config
import net
from keras.utils import to_categorical
from keras.callbacks import ModelCheckpoint, LearningRateScheduler
import mit_utils as utils
import time
from keras.models import load_model


os.environ["TF_CPP_MIN_LOG_LEVEL"] = '2'
os.environ["CUDA_VISIBLE_DEVICES"] = '3'
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session