我有以下pandas数据帧'df':
---------------------------------------------------
C1 C2 C3 C4 Type
---------------------------------------------------
Name
---------------------------------------------------
x1 a1 b1 c1 d1 'A'
x2 a2 b2 c2 d2 'A'
x3 a3 b3 c3 d3 'B'
x4 a4 b4 c4 d4 'B'
x5 a5 b5 c5 d5 'A'
x6 a6 b6 c6 d6 'B'
x7 a7 b7 c7 d7 'B'
---------------------------------------------------
此数据框中有6列:Name, C1, C2, C3, C4, and Type
。我想使用由“类型”列分组的数据帧生成两个线图(单独的图 - 在同一图上不是两行)。基本上,我想绘制C1的值相对于按类型分组的名称。因此,在一张图表上,我希望另一张图上有(x1, c1), (x2, c2), (x5, c5) on one plot, and (x3,c3), (x4, c4), (x6,c6), and (x7,c7)
。
请注意,Name和其他列位于不同的行中。
我在SO上发现了一个关于绘制箱图here的类似问题,所以我尝试将其修改为线图。我尝试使用df.plot(column='C1', by='Type')
,但似乎没有属性'column' for a plot()
。
关于如何实现目标的任何想法?
答案 0 :(得分:4)
您可以添加列"输入"到索引,并取消堆栈,以便根据Type的值将C1的值分成两列,然后绘制它们,例如:
import pandas
df = pandas.DataFrame({'Values': randn(10), 'Categories': list('AABABBABAB')}, index=range(10))
df.set_index('Categories', append=True).unstack().interpolate().plot(subplots=True)
请注意,对于折线图,您需要' interpolate()'。
或者,您可以根据" Type"的值来选择数据。 ("类别"在这些例子中)并分别绘制它们,例如:
fig, axes = plt.subplots(ncols=2)
df[df.Categories=='A'].Values.plot(ax=axes[0])
df[df.Categories=='B'].Values.plot(ax=axes[1])
答案 1 :(得分:0)
以下答案基于faltarell的第二种方法,但适用于任意数量的类别。
设置:
import pandas
import matplotlib.pyplot as plt
from numpy.random import randn
df = pandas.DataFrame({'Values': randn(10),
'Categories': list('AABABBABAB')},
index=range(10))
绘制图:
categories = df['Categories'].unique()
fig, axes = plt.subplots(ncols=len(categories))
for i, category in enumerate(categories):
df[df['Categories'] == category]['Values'].plot.line(ax=axes[i])
axes[i].set_title(category)
您可以使用标记线制作类似的单图绘图:
fig, ax= plt.subplots()
for category in df['Categories'].unique():
df[df['Categories'] == category]['Values'].plot.line(ax=ax, label=category)
plt.legend()