【问题标题】:Matplotlib plt.show() isn't showing graphMatplotlib plt.show() 不显示图表
【发布时间】:2014-03-08 10:41:34
【问题描述】:

我的绘图代码似乎没有显示图表(第 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)

【问题讨论】:

    标签: python graph matplotlib


    【解决方案1】:

    您正在尝试使用不会生成带有plt.show() 的图形的后端。相反,您需要使用另一个后端,例如 WXAgg 或 QT4agg,其选择取决于您的系统。请参阅 Matplotlib 后端的 this information。相反,如果您希望拥有 svg 格式的文件,您应该only使用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 tutorial,以便为您提供更全面但仍然相对简短和简单的 matplotlib 使用介绍。

    【讨论】:

    • 好的,谢谢。因此,当我注释掉matplotlib.use('SVG') 时,它可以显示交互的东西,但是我不能将它保存为.svg。有没有办法两者兼得?我还没有机会阅读所有链接,所以如果答案在那里,我今晚回家时会找到它。
    【解决方案2】:

    如果您在带有--no-site-packages 的virtualenv 中执行pip install matplotlib,并且plt.show() 没有显示您的情节:

    1) apt-get 安装 matplotlib,然后 virtualenv --system-site-packages FOLDERNAME

    2) 或者,来自this guide

    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

    【讨论】:

      【解决方案3】:

      我的情况是,我通过从 python.org 安装 python 3.7 解决了这个问题,然后在我的 IDE (PyCharm CE) 上简单地更改了解释器 + 当然再次安装了所有必要的包。无需使用另一个后端,我将 TkAgg 保留在我的项目中。

      【讨论】:

        【解决方案4】:

        试试这个:-

        plot = plt.figure()
        plt.plot(xData, yData)
        plt.show()
        plt.savefig(str(name).split()[0]+'.png)
        

        请尽量不要将 name 作为用户的输入

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-29
          • 1970-01-01
          相关资源
          最近更新 更多