Панель данных Pandas DataFrame сбрасывает значения - PullRequest
0 голосов
/ 17 декабря 2018

Во время анализа данных я использую метод df.plot.bar в pandas Dataframe для построения графиков своих результатов:

df.plot.bar(figsize=(15, 5), legend=None)

Проводя еще несколько исследований, я заметил, что в некоторых случаях графики выглядят по-разному.Причина этого заключается в том, что метод plot.bar начинает игнорировать информацию, когда figsize слишком низок.

В моем примере было 31 столбец на событие, и на графике figsize=(10, 5) меньше столбцов, чем на figsize(15, 5).Это известное и желаемое поведение?Потому что без предупреждения график пропускает (важную) информацию.

Фрейм данных:

                 Day(X-Axis in plot)
+------------+-----------------------+
| Id    +  Day1  |   Day2  |   Day3  ...
+------------+-----------------------+
| 0     + 0      |   20    |    0
| 1     | 300    |   10    |    400
| 3     + 20     |   0     |    400
| 4     | 60     |   0     |    800
...
+------------+-----------------------+

Значения представляют собой совокупность определенного идентификатора в определенный день.

КаждыйУ id есть свой бар на каждый день.Кадр данных транспонируется с помощью T, чтобы plot.bar отображал дни на оси X.

figsize=(10, 5)

figsize(10, 5)

figsize(15, 5)

figsize(15, 5)

1 Ответ

0 голосов
/ 17 декабря 2018

В качестве оценки: у вас есть 12 строк и 31 столбец.Бары занимают 80% пространства юнита.Полоса должна иметь ширину не менее двух пикселей, чтобы ее можно было увидеть на экране.Обычная фигура имеет 10% полей с обеих сторон осей и имеет 100 точек на дюйм.Тогда вам нужна ширина фигуры 2 * 12 * 31 / 0,8 ** 2/100 ~ = 12 дюймов.Другими словами, если у вас более 31 столбца, некоторые столбцы могут не отображаться на рисунке шириной 12 дюймов.

Чтобы сделать это воспроизводимым, давайте рассмотрим следующий случай, когда у нас есть N=20 строк иколонны.

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

N=20
df = pd.DataFrame(np.diag(np.ones(N)))

ax = df.plot.bar(legend=False)

plt.show()

enter image description here

Здесь некоторые столбцы не видны.Мы можем рассчитать, что для 20 строк и 20 столбцов эта цифра должна иметь ширину 2*N**2/0.8**2/100. == 12.5 дюйм.

N=20
df = pd.DataFrame(np.diag(np.ones(N)))

w = 2*N**2/0.8**2/100.
plt.rcParams.update({"figure.figsize" : (w, 4.8), "figure.dpi" : 100})
ax = df.plot.bar(legend=False)

Теперь она действительно показывает все столбцы.

enter image description here

Конечно, рисунок нельзя сделать сколь угодно большим, поэтому вместо этого можно убедиться, что у стержней есть линия края, которая будет нарисована независимо от протяженности прямоугольника.

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

N=20
df = pd.DataFrame(np.diag(np.ones(N)))

ax = df.plot.bar(legend=False)
for bar in ax.patches:
    bar.set_linewidth(0.72)
    bar.set_edgecolor(bar.get_facecolor())
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...