我有一个数据框,每两行有相等的“时间”索引,两个“数据”列的值可能相等,值 1 只包含正数,值 2 只包含负值,一个“类型”列与一行不同来自另一个:
time type value1 value2
01:26:00 A 1 -5
01:26:00 B 2 -6
01:28:35 A 3 -7
01:28:35 B 4 -8
我可以为任一类型绘制条形图,也可以绘制一个叠加在一起的组合条形图(当我注释掉第 1 行时):
df = df.loc['type'] /line #1
df.plot(x='time', y=['value1', 'value2'], kind='bar', stacked=True)
我需要的是绘制条形图,时间在 X 轴上,A 的值 1 与 B 的值 1 并排,相反的是 A 的值 2 和 B 的值 2,如下所示:
非常感谢您的帮助。
答案 0 :(得分:1)
这可以使用 seaborn barplot 函数来完成,该函数提供了方便的 hue
参数,可以并排显示 A 和 B。在以下示例中,saturation
参数用于区分 value1 和 value2:
import io
import pandas as pd # v 1.2.3
import seaborn as sns # v 0.11.1
# Create sample dataset
data = """
time type value1 value2
01:26:00 A 1 -5
01:26:00 B 2 -6
01:28:35 A 3 -7
01:28:35 B 4 -8
"""
df = pd.read_csv(io.StringIO(data), delim_whitespace=True)
# Create bar chart
ax = sns.barplot(data=df, x='time', y='value1', hue='type', saturation=1, zorder=2)
sns.barplot(data=df, x='time', y='value2', hue='type', saturation=0.6, zorder=2, ax=ax)
ax.set_ylabel('value1 and value2', labelpad=10)
# Format chart
ax.grid(axis='y', linewidth=0.5, zorder=1)
ax.axhline(color='black', linewidth=1, alpha=0.3)
ax.tick_params(axis='both', which='major', length=0)
sns.despine(left=True, bottom=True)
# Edit legend
handles, labels = ax.get_legend_handles_labels()
ntypes = df['type'].nunique()
ax.legend(handles[:ntypes], labels[:ntypes], loc=(1.03, 0.5), frameon=False);