python - الفرق في التآمر مع إصدارات مختلفة matplotlib



(1)

تتم قراءة البيانات في شكل سلاسل. في 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 لقراءة الملفات في صفائف عائمة. إذا كان الملف يحتوي على تواريخ ، فسيكون من الممكن استخدام محول كما هو الحال في قراءة ملف محدد بفواصل مع كائن تاريخ وتعويم باستخدام Python .

خيار آخر للقراءة في الملفات النصية هو pandas.read_csv .

أعطاني زميل لي نصًا يستخدم لجمع البيانات من قاعدة بيانات ورسمها. عندما استخدمت البرنامج النصي بنفسي ، لا تبدو المخططات كما هي ، وتتعلق بإصدار 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)

عندما أقوم بتشغيله باستخدام الإصدار 2.1.0 من Matplotlib ، تبدو صورتي كما يلي: عندما أقوم بتشغيله باستخدام الإصدار 2.0.2 من Matplotlib ، يبدو الأمر كما هو مفترض:

يبدو الملف الذي يقرأه النص كما يلي:

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