具有多个值的熊猫系列如何正确绘制

时间:2018-12-02 13:27:29

标签: python pandas matplotlib

我有以下数据:

1, method1, 3, type1, 73.9203
2, method1, 3, type1, 38.6353
3, method1, 3, type1, 38.0158
4, method1, 3, type1, 19.6426
5, method1, 3, type1, 52.3507
6, method2, 3, type2, 500.048
7, method2, 3, type1, 14.5179
8, method2, 3, type2, 500.029
9, method2, 3, type1, 267.738
10, method2, 3, type2, 500.008
11, method1, 4, type2, 500.036
12, method1, 4, type1, 271.698
13, method1, 4, type1, 309.884
14, method1, 4, type1, 103.91
15, method1, 4, type1, 478.43
16, method2, 4, type2, 500.071
17, method2, 4, type2, 500.033
18, method2, 4, type2, 500.151
19, method2, 4, type2, 500.09
20, method2, 4, type2, 500.009

我使用Python熊猫读取了这些数据:

import pandas
import matplotlib.pyplot as plt

data_frames = pandas.read_csv("results2.txt", sep=r',\s+', engine = "python", header=None)
data_frames.columns = ["id", "method", "number", "type", "running_time"]

print(data_frames)

哪个成功:

    id   method  number   type  running_time
0    1  method1       3  type1       73.9203
1    2  method1       3  type1       38.6353
2    3  method1       3  type1       38.0158
3    4  method1       3  type1       19.6426
4    5  method1       3  type1       52.3507
5    6  method2       3  type2      500.0480
6    7  method2       3  type1       14.5179
7    8  method2       3  type2      500.0290
8    9  method2       3  type1      267.7380
9   10  method2       3  type2      500.0080
10  11  method1       4  type2      500.0360
11  12  method1       4  type1      271.6980
12  13  method1       4  type1      309.8840
13  14  method1       4  type1      103.9100
14  15  method1       4  type1      478.4300
15  16  method2       4  type2      500.0710
16  17  method2       4  type2      500.0330
17  18  method2       4  type2      500.1510
18  19  method2       4  type2      500.0900
19  20  method2       4  type2      500.0090

我想做的是创建数据的条形图:

  • x轴:每种方法不同的number
  • y轴:类型数。

所以我有以下代码:

series = data_frames.groupby(["number", "method", "type"])["type"].count()

哪个给:

number  method   type
3       method1  type1    5
        method2  type1    2
                 type2    3
4       method1  type1    4
                 type2    1
        method2  type2    5
Name: type, dtype: int64

因此,条形图应如下所示: enter image description here

所以基本上,我想要一个条形图,作为x轴值,我们每number有一个不同的method,每个条形代表该type的{​​{1}}

在我发现可以使用methodmatplotlib进行绘图之前,我先手动查找了这些值,然后根据需要进行了绘图,但是现在有了Pandas,您可以拥有更多干净,易读且美观的代码,我想以最好的方式做到这一点。

我尝试过的是:

pandas

但结果与我要寻找的结果不尽相同:

enter image description here

1 个答案:

答案 0 :(得分:1)

import matplotlib.pyplot as plt

suu = series.unstack(level=1).unstack() # Unstack, so that we can stack in the plot
methods = suu.columns.get_level_values('method').unique().tolist()[::-1] # Find the groups for the grouped plot
fig, ax = plt.subplots(1, 1) # Plot everything on 1 ax-object
for i, t in enumerate(methods[::-1]): # Select group
    # Stack types, plot one one ax-object
    suu[t].plot(kind='bar', stacked=True, position=i, color=['g', 'r'], ax=ax, 
       legend=i, width=0.25) # Only show one legend, and smaller bars so the groups don't touch

您想要堆叠的条形图,因此首先需要取消分组依据。 您只需要一个部分堆叠,部分分组的条形图。因此,选择一组数据框中的一部分。 stacked=True堆叠类型,并且for循环将方法分组。通过选择1或0的位置,我们可以确保它们不重叠,并且通过指定较小的宽度,可以确保组之间不直接相邻。我们不希望有多个图例,因此只显示其中一个组的图例。

希望这会有所帮助

Output