我有以下数据:
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
我想做的是创建数据的条形图:
number
。所以我有以下代码:
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
所以基本上,我想要一个条形图,作为x轴值,我们每number
有一个不同的method
,每个条形代表该type
的{{1}}
在我发现可以使用method
和matplotlib
进行绘图之前,我先手动查找了这些值,然后根据需要进行了绘图,但是现在有了Pandas,您可以拥有更多干净,易读且美观的代码,我想以最好的方式做到这一点。
我尝试过的是:
pandas
但结果与我要寻找的结果不尽相同:
答案 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的位置,我们可以确保它们不重叠,并且通过指定较小的宽度,可以确保组之间不直接相邻。我们不希望有多个图例,因此只显示其中一个组的图例。
希望这会有所帮助