如何基于两个单独列中的所有值进行绘制?

时间:2019-04-23 22:27:28

标签: pandas matplotlib

我试图通过三个平台XBL,PSN和PC来绘制莱因哈特在各个级别的胜率。我希望条形图具有三个x值,每个平台一个。我在使用两个单独的列作为数据进行图形绘制时遇到了问题。

我尝试了以下方法:

df[(['Hero'] == 'Reinhardt') & (['Rank'] == 'All')].plot.bar(x='Platform', y='Win_rate')

这给出了错误:KeyError:False

df[.loc[df['Hero'] == 'Reinhardt' & df['Rank'] == 'All']].plot.bar(x='Platform', y='Win_rate')

哪个给出:TypeError:无法将类型为[bool]的标量的dtyped [object]数组进行比较

我希望出现三个条形图,其中x标签为PC,XBOX和PSN,y轴为winrates。抱歉,以前是否有人问过这个问题,但我似乎已死胡同。 以下是各列: Dataframe with all Reinhardt values, can't direct paste because of reputation

1 个答案:

答案 0 :(得分:0)

我使用此代码生成了一些示例数据,请说明格式是否正确:

In[1]: 
import numpy as np
import pandas as pd

hero = np.random.choice(['Ana', 'Reinhardt', 'Widow', 'Hanzo', 'Torb'], 30)
platform = np.random.choice(['XBL', 'PSN', 'PC'], 30)
winrate = np.random.rand(30) * 100

df = pd.DataFrame({'Hero': hero,
                   'Platform': platform,
                   'Winrate': winrate})

unique = df.groupby(['Platform', 'Hero']).agg({'Winrate': 'mean'}).reset_index()
unique.head()

Out[1]:     
    Platform    Hero        Winrate
0   PC          Ana         33.721728
1   PC          Hanzo       27.350393
2   PC          Reinhardt   60.182229
3   PC          Torb        71.929657
4   PC          Widow       51.911960

最方便地按组绘制数据的方法是使用seaborn,它建立在matplotlib的顶部(请参阅sns.barplot

In[2]: import seaborn as sns
sns.barplot(data=unique, x='Hero', y='Winrate', hue='Platform')

plot