Matplotlib的plt.show()没有显示图表

13

我的绘图代码似乎没有显示图形(第12到59行可能不是问题所在,但我包括它们只是以防万一——我有些数据需要花费一段时间放入排序列表中)。

我已经进行了一些尝试和尝试了不同的方法,但我认为主要问题是我不理解figure()plt.show()import matplotlib.pyplot as pltfrom pylab import *以及其他一些代码的含义。我不知道什么时候需要使用它们,也不知道为什么需要使用它们。

能否有人帮助我并解释如何绘制两个列表的.svg文件,并在最后显示它,同时详细说明每条线路的包含情况以及何时需要在前面加上plt.,何时需要在前面加上ax.,以及何时不需要在前面加上任何东西等?很抱歉这会花费很长时间来回答,但我真的不理解Matplotlib或他们网站上的任何示例。

import matplotlib
matplotlib.use('SVG')
import matplotlib.pyplot as plt
import string, math
from pylab import *
from decimal import *

name = raw_input("Enter the filename:\n")

myfile = open("datafiles/"+name+".data", 'r')

xData = []
yData = []
plots = [name]
mydata = myfile.readlines()

i = 0
N = len(mydata)
while (i < N):
    string = mydata[i]
    data = [str(x) for x in string.split(" ")]
    data=filter(lambda x: len(x)>0, data)
    xData.append(data[1])
    yData.append(data[2])
    i = i + 1

i = 0
while (i < N):
    if (float(xData[i]) <= 0):
        xData[i] = ""
        yData[i] = ""
    if (xData[i] == "nan" or xData[i] == "-nan"):
        xData[i] = ""
        yData[i] = ""
    i = i + 1

xData=filter(lambda x: len(x)>0, xData)
yData=filter(lambda x: len(x)>0, yData)

N = len(xData)
i = 0

while (i < N):
    xData[i] = float(xData[i])
    yData[i] = float(yData[i])
    i = i + 1

j = 0
while (j < N):
    i = 0 
    while (i < (N-j-1)):
        if (xData[i]>xData[i+1]):
            a, b = xData[i], xData[i+1]
            xData[i+1], xData[i] = a, b

            a, b = yData[i], yData[i+1]
            yData[i+1], yData[i] = a, b
        i = i + 1
    j = j + 1

plot = plt.figure(1)
plt.plot(xData, yData)
plt.show(1)
plt.savefig(name)
6个回答

12
您正在尝试使用一个不支持plt.show()显示图形的后端。相反,您需要使用另一个后端,如WXAgg或QT4agg,选择取决于您的系统。有关Matplotlib后端的详细信息,请参见此处信息。如果您希望得到SVG格式的文件,则应仅使用plt.savefig('filename.svg')。生成的文件将位于您的工作目录中,您只需在脚本完成后打开它即可。
解释一下其他问题中你不理解的代码行: plt.show() 将在屏幕上产生交互式图,假设您正在使用支持向用户界面绘制的后端(渲染器)。 import matplotlib.pyplot as plt 仅从matplotlib包中导入pyplot库的函数和类,而as plt部分类似于创建一个昵称以更轻松地访问这些函数。例如, plt.show()plt.figure等,而不必每次都键入matplotlib.pyplot.show()。另一方面,from pylab import *导入所有函数而没有前缀。总的来说,我会避免使用import *,因为稍后读回代码可能会令人困惑。此外,pylab可能不是您在此处展示的代码所需的。 plt.figure()是初始化您的图形的命令。在这种情况下,由于您使用了plot = plt.figure,因此您现在可以键入plot.plot(xData, yData),因为您的变量plot现在是图形类的一部分。例如,如果您需要在其他轴、子图或色条上执行某些操作,则会使用ax

我强烈推荐您阅读matplotlib网站上的pyplot教程,这将为您提供更全面、但仍相对简明和简单的介绍如何使用matplotlib。


啊,好的,谢谢。所以当我注释掉 matplotlib.use('SVG') 后,它可以显示交互式内容,但是我就不能将其保存为 .svg 文件了。有没有办法两者兼得?不过我还没有来得及阅读所有链接,如果答案在那里的话,我会在今晚回家后找到它的。 - Jamie Twells

5

好的,答案很简单。(Ubuntu 21.10)

PyQt

您需要安装某个版本的PyQt。当前版本为:

pip install PyQt6

指定 GUI 后端

import matplotlib
matplotlib.use("QtAgg")

尝试使用 plt.show()

from matplotlib import pyplot as plt

# some code here

plt.show()

这对我来说完美无缺,希望对你也有效。


3
如果您在虚拟环境中使用--no-site-packages命令安装了matplotlib,但plt.show()无法显示您的图形,则可以按照以下两种方法之一解决:
1) 安装matplotlibapt-get install matplotlib,然后使用virtualenv --system-site-packages FOLDERNAME命令创建虚拟环境。
2) 从这篇指南中了解更多信息。
pip uninstall matplotlib  
sudo apt-get install python-gtk2-dev
ln -sf /usr/lib/python2.7/dist-packages/{glib,gobject,cairo,gtk-2.0,pygtk.py,pygtk.pth} $VIRTUAL_ENV/lib/python2.7/site-packages
pip install matplotlib

这个指南还有一步,但对我来说不是必要的(在~/.config/matplotlib/matplotlibrc中将后端设置为GTKAgg)。


0
在我的情况下,我通过从python.org安装Python 3.7并在我的IDE(PyCharm CE)上更改解释器来解决了这个问题,当然还需要重新安装所有必要的软件包。没有必要使用另一个后端,我仍然在我的项目中使用TkAgg。

0

我的问题略有不同:

我有一个Jupyter笔记本,在那里我正在进行

    import matplotlib.pyplot as plt

一开始我导入了它,但后来重新导入后,重新导入后的数字无法工作。删除第二次导入似乎解决了这个问题。


0
尝试这个:-
plot = plt.figure()
plt.plot(xData, yData)
plt.show()
plt.savefig(str(name).split()[0]+'.png)

请尽量不要从用户输入中获取名称


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接