Панды - создание сложного участка размером n - PullRequest
0 голосов
/ 29 января 2019

У меня есть DataFrame, который выглядит следующим образом:

                  1         2         3         4    5    6    7    8   9   10 ...  15  16  17   18  19  20  21  22  23  24
Date                                                                           ...                                         
1990-01-02  0.971710  0.027471  0.000819  0.000000  0.0  0.0  0.0  0.0   0   0 ...   0   0   0  0.0   0   0   0   0   0   0
1990-01-03  0.966265  0.032919  0.000815  0.000000  0.0  0.0  0.0  0.0   0   0 ...   0   0   0  0.0   0   0   0   0   0   0
1990-01-04  0.970886  0.028280  0.000833  0.000000  0.0  0.0  0.0  0.0   0   0 ...   0   0   0  0.0   0   0   0   0   0   0
1990-01-05  0.969092  0.030065  0.000842  0.000000  0.0  0.0  0.0  0.0   0   0 ...   0   0   0  0.0   0   0   0   0   0   0
1990-01-08  0.970326  0.028856  0.000817  0.000000  0.0  0.0  0.0  0.0   0   0 ...   0   0   0  0.0   0   0   0   0   0   0
1990-01-09  0.969999  0.029176  0.000825  0.000000  0.0  0.0  0.0  0.0   0   0 ...   0   0   0  0.0   0   0   0   0   0   0

И я хочу создать составной график, с моей осью y, равной от 0 до 1, и график всегда достигает верхней границы yось (потому что сумма всех не-нан столбцов по горизонтали всегда будет 1).Хотя во многих моих столбцах есть nans, я хочу, чтобы мой график функционировал так, как если бы каждый столбец мог иметь какое-то значение.Я попытался сделать это с помощью следующего кода:

fig, ax = plt.subplots(figsize=(5, 3))
ax.stackplot(df.index, df, labels=list(df.columns))
ax.set_title('Combined debt growth over time')
ax.legend(loc='upper left')
ax.set_ylabel('Total debt')
ax.set_xlim(xmin=df.index[0], xmax=df.index[-1])
fig.tight_layout()

Однако во второй строке кода выше я получаю следующую ошибку:

{ValueError}operands could not be broadcast together with shapes (7222,) (24,) 

Нужно ли вручную указывать каждый столбец?Есть ли какой-нибудь умный способ просто передать несколько?

1 Ответ

0 голосов
/ 30 января 2019

Из документации matplotlib.pyplot.stackplot ожидается, что первый аргумент будет иметь размерность N, а второй - размерность MxN, поэтому ожидается, что каждая строка будет иметь размерность N,но df.index возвращает объект формы (7222,) (поскольку df имеет форму (7222, 24)).Вы можете увидеть это в действии в следующем примере, если вы переключите df.index и df.columns (как у меня).

Простое решение здесь - просто транспонировать DataFrame.Это тогда даст matplotlib то, что он ожидает для аргументов стека.

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

df = pd.DataFrame([[0.971710, 0.027471, 0.000819, 0.0], 
                   [0.966265, 0.032919, 0.000815, 0.0],
                   [0.970886, 0.028280, 0.000833, 0.0], 
                   [0.969092, 0.030065, 0.000842, 0.0], 
                   [0.970326, 0.028856, 0.000817, 0.0], 
                   [0.969999, 0.029176, 0.000825, 0.0]])
df.index = {"row 1", "row 2", "row 3", "row 4", "row 5", "row 6"}
df.columns = {"column 1", "column 2", "column 3", "column 4"}
plt.stackplot(df.columns, df, labels=list(df.index))
plt.title("Original")
plt.show()
t = df.transpose()
plt.stackplot(t.columns, t, labels=list(t.index))
plt.title("Transposed")
plt.show()

Untransposed dataframe with index and column switched in stackplot

Transposed dataframe result

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