我有一个简单的dataframe
,如下所示:
Condition State Value
0 A AM 0.775651
1 B XP 0.700265
2 A HML 0.688315
3 A RMSML 0.666956
4 B XAD 0.636014
5 C VAP 0.542897
6 C RMSML 0.486664
7 B XMA 0.482742
8 D VCD 0.469553
现在,我希望每个值都有一个 barplot ,如果Condition相同,则每个状态的颜色相同。我尝试了以下python代码:
Data_Control = pd.ExcelFile('Bar_plot_example.xlsx')
df_Control= Data_Control.parse('Sheet2')# my dataframe
s = pd.Series(df_Control.iloc[:,2].values, index=df_Control.iloc[:,1])
colors = {'A': 'r', 'B': 'b', 'C': 'g', 'D':'k'}
s.plot(kind='barh', color=[colors[i] for i in df_Control['Condition']])
plt.legend()
但是我无法针对每种情况正确获得图例。我得到以下情节。
那么我应该如何为每种情况获得正确的图例?非常感谢您的帮助。
答案 0 :(得分:2)
因此,我在直接从熊猫进行绘图方面还没有做很多工作,但是您必须访问手柄并使用它来构造可以传递给plt.legend
的手柄和标签列表。
s.plot(kind='barh', color=[colors[i] for i in df['Condition']])
# Get the original handles.
original_handles = plt.gca().get_legend_handles_labels()[0][0]
# Hold the handles and labels that will be passed to legend in lists.
handles = []
labels = []
conditions = df['Condition'].values
# Seen conditions helps us make sure that each label is added only once.
seen_conditions = set()
# Iterate over the condition and handle together.
for condition, handle in zip(conditions, original_handles):
# If the condition was already added to the labels, then ignore it.
if condition in seen_conditions:
continue
# Add the handle and label.
handles.append(handle)
labels.append(condition)
seen_conditions.add(condition)
# Call legend with the stored handles and labels.
plt.legend(handles, labels)
答案 1 :(得分:1)
您可以直接从数据中创建图例的句柄和标签:
labels = df['Condition'].unique()
handles = [plt.Rectangle((0,0),1,1, color=colors[l]) for l in labels]
plt.legend(handles, labels, title="Conditions")
完整示例:
u = """ Condition State Value
0 A AM 0.775651
1 B XP 0.700265
2 A HML 0.688315
3 A RMSML 0.666956
4 B XAD 0.636014
5 C VAP 0.542897
6 C RMSML 0.486664
7 B XMA 0.482742
8 D VCD 0.469553"""
import io
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv(io.StringIO(u),sep="\s+" )
s = pd.Series(df.iloc[:,2].values, index=df.iloc[:,1])
colors = {'A': 'r', 'B': 'b', 'C': 'g', 'D':'k'}
s.plot(kind='barh', color=[colors[i] for i in df['Condition']])
labels = df['Condition'].unique()
handles = [plt.Rectangle((0,0),1,1, color=colors[l]) for l in labels]
plt.legend(handles, labels, title="Conditions")
plt.show()