Как изобразить определенные значения из столбцов (подпланов) - PullRequest
0 голосов
/ 02 марта 2019

Мой текущий фрейм данных выглядит следующим образом:

                     a   b    c    d    e     
 in_1   |   in_2  |
--------|-----------------------------------
 car    | bmw        2   4    5    34   46
        | merc       23  4   55    64   21 
        | range      453 32   2    56   21
        | lambo      4   6    2    5    12 
        | ferrari    12  46   34   23   642
fastfood| burger     123 34   213  23   234
        | kfc        123 34   235  123  24
        | tacoBell   213 432  124   12  1

Я пытаюсь построить подзаговор для каждого 'in_1', в котором ось x является именами столбцов (a, b, c, d,е), в то время как ось Y является счетчиком (числа в ячейках).

Таким образом, первый участок будет иметь название «машина».Ось X будет иметь «a», «b», «c», «d», «e».Ось Y будет иметь значения для каждого из 'bmw', 'merc', 'range', 'lambo', 'ferrari'.

Подплощадки могут быть столбчатыми или линейными, а значения in_2 могут быть представлены в виде легенды.

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

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

. Обратите внимание, что предполагается, что у вас есть индекс MULI с in_1 и in_2 в качестве значений индекса.

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

n = len(df.columns)
rows = df.index.get_level_values('in_1').unique()
index = np.arange(n)

fig, axs = plt.subplots(len(rows),1,figsize=(15,10))
width = 0.2

colors=["#e08283", "#52b3d9", "#fde3a7", "#3fc380"]

for i in range(len(rows)):
    intdf = df[df.index.get_level_values('in_1') == rows[i]]
    offset = 0
    for j in range(len(intdf.index.get_level_values('in_2'))):
        v = intdf.iloc[j,].values
        axs[i].bar(index + offset, v, width, 
                   label=intdf.index.get_level_values('in_2')[j], color=colors[j])

        offset += width

    axs[i].set_xlabel(rows[i])
    axs[i].set_xticks(index + width)
    axs[i].set_xticklabels(tuple(df.columns))
    axs[i].legend(loc=2)


plt.show()

Вот вывод.

enter image description here

В качестве напоминания можно найти дополнительную информацию здесь

0 голосов
/ 03 марта 2019

Итак, я думаю, вы могли бы сделать что-то вроде этого:

import numpy as np
import matplotlib.pyplot as plt

ng = 5 #number of groups

bmw = ..
merc = ..
..

fig, ax = plt.subplots()

index = np.arrange(ng)
bar_width = 0.2

fbmw = ax.bar(index, bmw, bar_width, color='r', label='BMW')
fmerc = ax.bar(index + bar_width, merc, color='b', label='MERC')
...
#don't forget to increase bar_width everytime

ax.set_xlabel('Cars')
ax.set_ylabel('Whatever this is')
ax.set_xticks(index + bar_width/2)
ax.set_xticklabels(('a', 'b', 'c', 'd', 'e'))
ax.legend()

fig.tight_layout()

Поскольку я не знаю, что такое числа и столбцы a, b, c, d, e, я оставил эти метки пустыми.Также я подумал, что у вас уже есть кадры данных для bmw, merc и т. Д., Поэтому я не импортировал их.Надеюсь, это поможет!

...