我有一个DataFrame,由以下列组成:
VP-ID,
MotivA_MotivatorA_InnerDriverA_PR,
MotivA_MotivatorA_InnerDriverB_PR,
MotivA_MotivatorB_InnerDriverA_PR,
MotivA_MotivatorB_InnerDriverB_PR,
MotivA_MotivatorC_InnerDriverA_PR,
MotivA_MotivatorC_InnerDriverB_PR,
MotivA_MotivatorD_InnerDriverA_PR,
MotivA_MotivatorD_InnerDriverB_PR,
...
MotivC_MotivatorA_InnerDriverA_PR,
MotivC_MotivatorA_InnerDriverB_PR,
MotivC_MotivatorB_InnerDriverA_PR,
MotivC_MotivatorB_InnerDriverB_PR,
MotivC_MotivatorC_InnerDriverA_PR,
MotivC_MotivatorC_InnerDriverB_PR,
MotivC_MotivatorD_InnerDriverA_PR,
MotivC_MotivatorD_InnerDriverB_PR.
后面的名称动机A等。当然是正确的术语(列名)。
这里,“PR”代表百分位数排名(0-100)。
一个图形表示一个动机,它由四个动机和两个变量组成,然后具有InnerDriverA_PR和InnerDriverB_PR的值。
最终结果应该如下所示:
这是“足球场图”吗
我如何用Matplotlib实现这个图?
最小可重复示例:
import pandas as pd
import random
import matplotlib.pyplot as plt
import seaborn as sns
# Create example data
columns = [
'MotivA_MotivatorA_InnerDriverA_PR',
'MotivA_MotivatorA_InnerDriverB_PR',
'MotivA_MotivatorB_InnerDriverA_PR',
'MotivA_MotivatorB_InnerDriverB_PR',
'MotivA_MotivatorC_InnerDriverA_PR',
'MotivA_MotivatorC_InnerDriverB_PR',
'MotivA_MotivatorD_InnerDriverA_PR',
'MotivA_MotivatorD_InnerDriverB_PR',
'MotivB_MotivatorA_InnerDriverA_PR',
'MotivB_MotivatorA_InnerDriverB_PR',
'MotivB_MotivatorB_InnerDriverA_PR',
'MotivB_MotivatorB_InnerDriverB_PR',
'MotivB_MotivatorC_InnerDriverA_PR',
'MotivB_MotivatorC_InnerDriverB_PR',
'MotivB_MotivatorD_InnerDriverA_PR',
'MotivB_MotivatorD_InnerDriverB_PR'
]
df = pd.DataFrame(columns=columns)
for i in range(1, 6):
df.loc[f'Subject_{i}'] = [random.randint(0, 100) for _ in range(len(columns))]
#────────────────────────────────────────────────
def create_horizontal_bar_chart(df, proband):
motives = sorted(set(col.split('_')[0] for col in df.columns))
for motive in motives:
columns = [col for col in df.columns if col.startswith(motive)]
data = df.loc[proband, columns].reset_index()
data['Motivator'] = data['index'].apply(lambda x: x.split('_')[1])
data['InnerDriver'] = data['index'].apply(lambda x: x.split('_')[2])
data['Value'] = data[proband]
data = data.drop(['index', proband], axis=1)
plt.figure(figsize=(10, 6))
sns.barplot(x='Value', y='Motivator', hue='InnerDriver', data=data)
plt.title(f'{proband} - {motive}')
plt.show()
create_horizontal_bar_chart(df, 'Subject_1')
然而,这创造了激励因素作为额外的酒吧,仍然远远没有达到我希望它,如在上面的例子。
1条答案
按热度按时间7kjnsjlb1#
这是脊柱图问题是它不会排列你的酒吧。要做到这一点,你需要有创造力:
输出:
然后...