首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何绘制两列间的相关性

如何绘制两列间的相关性
EN

Stack Overflow用户
提问于 2022-10-01 12:08:49
回答 1查看 109关注 0票数 0

任务如下:

在整个数据集中,运动员的年龄与他在奥运会上的成绩之间有关联吗?

每个运动员都有自己的名字、年龄、奖牌(金牌、银牌、铜牌或铜牌)。

在我看来,有必要对所有同龄运动员的数量进行统计,并计算出拥有任何类型奖牌(data.Medal.notnull())的运动员的百分比。这个图表应该显示x轴上的所有年龄,以及那些在y轴上有奖牌的人的百分比。如何在熊猫和马特普利布的帮助下获取这些数据并创建图形?

例如,表中的一些数据:

代码语言:javascript
复制
Name Age Medal
Name1 20 Silver 
Name2 21 NA
Name3 20 NA
Name4 22 Bronze
Name5 22 NA
Name6 21 NA
Name7 20 Gold
Name8 19 Silver
Name9 20 Gold
Name10 20 NA
Name11 21 Silver

结果应该是(如图所示):

代码语言:javascript
复制
19 - 100%
20 - 60%
21 - 33%
22 - 50%
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-01 13:23:41

首先,将df.Medal转换为1s表示奖章,将0s转换为NaN值,使用np.where

代码语言:javascript
复制
import pandas as pd
import numpy as np

data = {'Name': {0: 'Name1', 1: 'Name2', 2: 'Name3', 3: 'Name4', 4: 'Name5', 
                 5: 'Name6', 6: 'Name7', 7: 'Name8', 8: 'Name9', 9: 'Name10', 
                 10: 'Name11'}, 
        'Age': {0: 20, 1: 21, 2: 20, 3: 22, 4: 22, 5: 21, 6: 20, 7: 19, 8: 20, 
                9: 20, 10: 21}, 
        'Medal': {0: 'Silver', 1: np.nan, 2: np.nan, 3: 'Bronze', 4: np.nan, 
                  5: np.nan, 6: 'Gold', 7: 'Silver', 8: 'Gold', 9: np.nan, 
                  10: 'Silver'}}

df = pd.DataFrame(data)

df.Medal = np.where(df.Medal.notna(),1,0)

print(df)

      Name  Age  Medal
0    Name1   20      1
1    Name2   21      0
2    Name3   20      0
3    Name4   22      1
4    Name5   22      0
5    Name6   21      0
6    Name7   20      1
7    Name8   19      1
8    Name9   20      1
9   Name10   20      0
10  Name11   21      1

现在,您可以按以下方式绘制数据:

代码语言:javascript
复制
import seaborn as sns
import matplotlib.ticker as mtick

sns.set_theme()
ax = sns.barplot(data=df, x=df.Age, y=df.Medal, errorbar=None)

# in versions prior to `seaborn 0.12` use
# `ax = sns.barplot(data=df, x=df.Age, y=df.Medal, ci=None)`

ax.yaxis.set_major_formatter(mtick.PercentFormatter(xmax=1.0))

# adding labels
ax.bar_label(ax.containers[0], 
             labels=[f'{round(v*100,2)}%' for v in ax.containers[0].datavalues])

结果:

顺便说一句,如果您想要计算这些百分比,可以选择使用pd.crosstab

代码语言:javascript
复制
percentages = pd.crosstab(df.Age,df.Medal, normalize='index')\
    .rename(columns={1:'percentages'})['percentages']
print(percentages)

Age
19    1.000000
20    0.600000
21    0.333333
22    0.500000
Name: percentages, dtype: float64

因此,使用matplotlib,您还可以执行如下操作:

代码语言:javascript
复制
percentages = pd.crosstab(df.Age,df.Medal, normalize='index')\
    .rename(columns={1:'percentages'})['percentages'].mul(100)
    
my_cmap = plt.get_cmap("viridis")
rescale = lambda y: (y - np.min(y)) / (np.max(y) - np.min(y))

fig, ax = plt.subplots()

ax.bar(x=percentages.index.astype(str), 
             height=percentages.to_numpy(), 
             color=my_cmap(rescale(percentages.to_numpy())))

ax.yaxis.set_major_formatter(mtick.PercentFormatter())
ax.bar_label(ax.containers[0], fmt='%.1f%%')
    
plt.show()

结果:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73918175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档