如何从列(子图)中绘制某些值

时间:2019-03-02 18:28:15

标签: python pandas matplotlib subplot

我当前的数据框如下:

                     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,e),而y轴是计数(细胞)。

因此,第一个子图将具有标题“ car”。 x轴将具有“ a”,“ b”,“ c”,“ d”,“ e”。 y轴将包含“ bmw”,“ merc”,“ range”,“ lambo”,“ ferrari”中每个的计数。

子图可以是条形图或折线图,in_2的值可以用图例形式表示。

2 个答案:

答案 0 :(得分:1)

所以我想你可以做这样的事情:

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的数字和列是什么,所以我将这些标签留为空白。我还以为你已经有了宝马,默克等的数据框,所以我没有导入它们。希望这会有所帮助!

答案 1 :(得分:0)

您可以使用一个简单的循环来拾取所有列并将它们分配给一个轴。它还将创建一个子图,其行数由in_1中的唯一值确定。

请注意,它假定您具有一个以in_1in_2作为索引值的多重索引df。

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

提醒一下,可以找到更多信息here