Как мне исправить левую шкалу? Матплотлиб и Pandas - PullRequest
3 голосов
/ 03 апреля 2020

Я пытаюсь построить эти данные с помощью matplotlib.

Я могу получить все данные и составить график Джонс против времени, но мой масштаб становится дурацким, когда я попробуйте использовать набор данных Falls.

График и код, которые я создал, приведены ниже.

graph

import gspread
from oauth2client.service_account import ServiceAccountCredentials
import pandas as pd
from pandas import DataFrame
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np

scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']

credentials = ServiceAccountCredentials.from_json_keyfile_name(
         'pandastest-273019-00f3c09845fb.json', scope) # Your json file here

gc = gspread.authorize(credentials)

wks = gc.open("data").sheet1

data = wks.get_all_values()
headers = data.pop(0)

df = pd.DataFrame(data, columns=headers)
pd.set_option("display.max_rows",None,"display.max_columns", None)
print(df.head())

dates = []
fort = []
jones = []
pat = []
ferry = []
middle = []
north = []
canton = []
for x in data[:]:
    for i in range(0, len(x)):
        try:
            x[i] = int(x[i])
        except:
            continue

    print(x)
    dates.append(x[0])
    fort.append(x[1])
    jones.append(x[2])
    pat.append(x[3])
    ferry.append(x[4])
    middle.append(x[5])
    north.append(x[6])
    canton.append(x[7])

#fort
x = [dt.datetime.strptime(d,'%m/%d/%Y').date() for d in dates]
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=29))
plt.plot(x,fort)
plt.gcf().autofmt_xdate()
plt.legend(["fort", ])
plt.xlabel("Dates")
plt.ylabel("Matter")
plt.show()

Кто-нибудь знает, почему это происходит и как я могу это исправить?

1 Ответ

1 голос
/ 03 апреля 2020

Ваши значения по оси Y являются строками, их нужно преобразовать в скалярные значения, что-то вроде этого

for x in data[:]:
    # ...
    fort.append(int(x[1]))
    # ...

Конечно, есть гораздо более простой способ решения этой проблемы, если данные были прочитав pandas фрейм данных, вы можете напрямую извлечь данные столбца:

x = pd.to_datetime(df["Date"], format = "%m/%d/%Y")
fort = df["Fort McHenry Channel"].values

В любом случае результат будет

enter image description here

...