当前位置: 首页 > 面试题库 >

Python-不同matplotlib版本打印的差异

巫马正卿
2023-03-14
问题内容

该脚本用于从数据库中收集数据并进行绘制。当我自己使用脚本时,图看起来并不相同,这与Matplotlib的版本有关。

绘制数据的脚本非常短:

import matplotlib.pyplot as plt
import csv
import os
from dateutil import parser

def plot(outputDir,plotsDir,FS):
    allfiles = os.listdir(outputDir)
    flist = []
    for f in allfiles:
        if 'csv' in f.lower(): flist.append(f)
    for f in flist:
        with open(outputDir + '/' + f, 'rt') as ff:
            data = list(csv.reader(ff,delimiter=FS))
        values = [i[2] for i in data[1::]]
        values = ['NaN' if v is '' else v for v in values]
        time = [parser.parse(i[1]) for i in data[1::]]
        plt.xlabel('Time_[UTC]')
        plt.plot(time, values)
        plt.xticks(rotation=40)
        if os.path.isdir(plotsDir) != 1:
            os.mkdir(plotsDir, 777)
        plt.savefig('{}/{}_Data.png'.format(plotsDir, f[:-4]), bbox_inches='tight', dpi=160)
        plt.clf()


outputdir = 'C:/Users/matthijsk/Documents/Test'
plotsdir = outputdir + '/plots'
fs = ','
plot(outputdir, plotsdir, fs)

当我使用Matplotlib版本2.1.0运行它时,我的图像如下所示: Matplotlib版本2.1.0 当我使用Matplotlib版本2.0.2运行它时,它看起来应该是这样的: Matplotlib版本2.0.2

脚本正在读取的文件如下所示:

stationNo,dtg(UTC),TT_[°C],source_TT,quality_TT
10381,2017-01-01 00:00:00,3.0,ob,na
10381,2017-01-01 01:00:00,3.0,ob,na
10381,2017-01-01 02:00:00,2.4,ob,na
10381,2017-01-01 03:00:00,2.5,ob,na
10381,2017-01-01 04:00:00,2.5,ob,na
10381,2017-01-01 05:00:00,2.3,ob,na
10381,2017-01-01 06:00:00,1.9,ob,na
10381,2017-01-01 07:00:00,1.0,ob,na
10381,2017-01-01 08:00:00,0.1,ob,na
10381,2017-01-01 09:00:00,0.9,ob,na

谁能解释一下导致此问题的Matplotlib中发生了什么变化?显然,我在造成这种情况的绘图上做错了。谁能注意到一个错误?我已经尝试使用

values = [float(value) if value.isnumeric() else None for value in values]

但这并没有解决。注意:我宁愿不使用任何非标准软件包(如Pandas),因为安装此类软件包很容易获得批准。


问题答案:

数据以字符串形式读取。在matplotlib 2.0中,这些被自动转换为浮点数,以便可以对其进行绘制。

在matplotlib 2.1中,引入了分类图。现在这允许类似

plt.plot(["apple", "banana", "cherry"], [2,1,3])

虽然这对于某些应用程序当然是很好的选择,但它打破了以前绘制可转换为浮点数的字符串的选项。我想这还好,它只是赋予用户自己进行转换的责任。

在这种情况下,你可能希望进行如下转换

values = [None if v is '' else float(v) for v in values]

如果你已经有一个numpy数组: np.array(values).astype(float)

通常,可以用来numpy.loadtxt将文件读入float数组。如果文件包含日期,则可以使用转换器来读取带有日期对象的逗号分隔文件,并使用Python进行浮点运算。

读取文本文件的另一种选择是pandas.read_csv



 类似资料:
  • 问题内容: 我有一个python脚本test.py: 在linux命令行上执行 返回: 然后执行 哪个返回 如何重定向输出使os.system调用在print语句之前打印? 问题答案: 当您输出到管道时,Python缓冲写入的输出,并在刷新,溢出,关闭后(程序退出时)输出。虽然它将缓冲打印调用,但系统调用输出将直接输出到stdout中,并且其输出将不会被缓冲。这就是为什么您会看到这样的优先级。为了

  • 问题内容: 我默认使用python2.6的ubuntu 10.04。我已经安装了python2.7。 当我想安装python软件包时 它被安装到python2.6。我如何才能将软件包安装到python2.7?有什么选择吗? 我已经看过这个,但我找不到我的OS这样的目录。我考虑过使用,但并非所有软件包都受支持。例如。 我对将python2.7与绑定更感兴趣。 问题答案: Python具有自己的软件包

  • 问题内容: 为什么Guido(或其他任何人)决定打印到stderr而不是stdout?只是好奇用例是什么,它使标准错误比标准错误更合适。 问题答案: Python 3.4已修改为输出到,这是预期的行为。此处将其列为Python的错误:http : //bugs.python.org/issue18338。错误报告中的注释表明,尽管这是一个合理的选择,但它会破坏向后兼容性。Python 2.7.9在

  • 问题内容: 我有一个目前使用python 2.5.4运行的系统。我正确安装了,一切正常。我是否可以将与其他版本的Python一起使用? 我编译了Python 2.6.2,并希望将其与一些一起使用。覆盖二进制文件是否足够?还是我必须更改有关库的某些内容? 问题答案: 在创建实例时,只需使用(或)选项来指定要使用的Python可执行文件,例如:

  • 问题内容: 我有一个程序,告诉我它有多远。 因此,如果len(some_list)为50,我将最后一行打印50遍。我想打印一行并继续更新该行。我知道我知道这可能是您整天都会阅读的最棘手的问题。我只是想不通我需要输入到Google以获得答案的四个词。 更新!我尝试了mvds的建议,认为正确。新密码 完成百分比只是一个字符串(我是第一次尝试抽象,现在是抽象的)。现在的结果是,它运行该程序,直到程序结束

  • 问题内容: 我想更改网页上的某些内容。我也想隐藏一些东西。打印时,有没有办法用CSS做到这一点?我尤其希望能够隐藏一些DIV及其包含的所有DIV。 问题答案: 可以使用单独的打印样式表来实现。该属性是关键: