Ось X невидима для большого набора данных - PullRequest
0 голосов
/ 23 марта 2020

Я новичок в python и пытаюсь построить данные, где дата и время находятся на оси X. Данные о количестве твитов за часы, в течение нескольких дней. Поскольку данные огромны, масштаб оси X становится невидимым. Ниже приведен фрагмент из основных данных (данные, которые я хочу построить)

> Date       Hour 
> 2017-06-01  0        9922287
>             1        8518504
>             2       11329880
>             3        8917199
>             4        2561618
>             5        5356574
>             6        9094935
>             7        5668480
>             8       10685864
>             9        4817401
>             10      13737030
>             11      13102746
>             12      36891729
>             13      28093150
>             14      13071736
>             15      26999175
>             16      25637322
>             17      24140113
>             18      12172451
>             19      27828496
>             20      14746762
>             21      30112348
>             22      25418125
>             23      15357580 
> 2017-06-02  0       11392671
>             1        5044931
>             2        4476793
>             3        2218296
>             4        1736378
>             5         838815
>                       ...    
> 2017-06-03  22      10569552
>             23       9315997

Я использовал приведенный ниже код для своего графика.

df.plot(marker='*')

plt.legend().set_visible(False)

plt.title("Number of tweets on hourly basis")

enter image description here

При корректировке по размеру я использовал plt.figure (figsize = (20,10)), получаю изображение ниже. Но все равно мои номера оси x невидимы.

image введите описание изображения здесь ">

1 Ответ

0 голосов
/ 23 марта 2020

Возможно, последняя версия pandas не установлена. В моей системе с pandas 1.0.3 x-метки отображаются как [2017-06-01 00:00:00, 0]. Установка поворота метки с помощью df.plot(marker='*', rot=30) делает так, чтобы они не перекрывались.

Но в любом случае, это не очень приятный вывод. (Я предполагаю, что столбец «Дата» имеет формат даты pandas. Если он имеет формат строки, результат будет аналогичным, без 00:00:00.)

В любом случае, путь к go будет объединять столбцы даты и часа в один столбец даты и времени. Вот возможный подход:

from matplotlib import pyplot as plt
import pandas as pd
import numpy as np

# first create a dataframe similar to the example
days = pd.date_range('2017-06-01', '2017-06-03', freq='D')
df = pd.DataFrame({'Date': np.repeat(days, 24),
                   'Hour': np.tile(np.arange(0, 24), len(days)),
                   'NumTweets': np.random.binomial(10000, 0.2, 24 * len(days))})
df.set_index(['Date', 'Hour'], drop=True, inplace=True)

# df.plot(marker='*', rot=30)  # this would be the plot from the question

df.reset_index(inplace=True) # remove the index, making 'Date' and 'Hour' regular columns
# create a new column combining 'Date' and 'Hour'
df['Time'] = pd.to_datetime(df['Date'].dt.strftime('%Y-%m-%d') + ' ' + df['Hour'].astype(str).str.zfill(2))
# use the new column as index
df.set_index('Time', drop=True, inplace=True)

# as the 'Date' and 'Hour' columns are still there, indicate we only want to plot the 'NumTweets' column
df.plot(y='NumTweets', marker='*', rot=20) # rot=0 would also work, depending on the figure width
plt.tight_layout() # make space to show the labels

plt.show()

Обратите внимание, что pandas адаптирует вашу ось X в зависимости от количества отображаемых дней. Всего через 3 дня в 00:00 ч будут «основные» отметки, а в 12:00 - «второстепенные». При большем количестве дней тиковых часов не будет.

resulting plot

...