首页 > 解决方案 > 如何绘制在 Y 轴上显示总人口百分比的分布曲线

问题描述

我正在尝试使用 matplotlib 绘制按地区分组的工资分布图,y 轴显示拥有该工资的人的百分比。

到目前为止,我已经能够想出:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
records = pd.DataFrame({'Name': ['John','Rachel','Tom','Stan','Jack','Ben','Joe','Juliet','Nigel','Veronica','Cam'], 
         'salary': [40104,29401,57383,38494,99302,44733,40242,49555,13934,44011,88920],
                     'Country': ['USA', 'USA', 'USA', 'France', 'France', 'France', 'China', 'China', 'Japan', 'Japan', 'France'],
                     'Region': ['America', 'America', 'America', 'Europe', 'Europe', 'Europe', 'Asia','Asia','Asia','Asia','Europe']})
recordsgraph = records.pivot(columns='Region',values='salary')
recordsgraph.plot.density()

在此处输入图像描述

但我希望 y 轴显示每个地区拥有该薪水的人口百分比。关于如何做到这一点的任何想法?

标签: pythonpandasmatplotlib

解决方案


Pandas密度图绘制了一个近似概率密度函数的核密度估计(kde) 。这样的函数被缩放,使得总面积等于。y 轴将在 x 轴上显示一个单位的估计概率。因此,在这种情况下,值表示工资有可能恰好是某个给定的 x 值加减半。例如,它在和之间。12.5e-50.0025 %44,22044,221

您可能需要更粗略的范围。假设您想要一个5000. 如果将 y 轴上的值乘以 5000(和 100),您将得到薪水在给定 x 值正负 2500 范围内的百分比概率。下面的代码显示了一种方法在不接触数据的情况下乘以 y 值,使用FuncFormatter.

import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
import pandas as pd

def percentage_base_5000(x, pos):
    return f'{x * 5000 * 100:.1f} %'

records = pd.DataFrame(
    {'Name': ['John', 'Rachel', 'Tom', 'Stan', 'Jack', 'Ben', 'Joe', 'Juliet', 'Nigel', 'Veronica', 'Cam'],
     'salary': [40104, 29401, 57383, 38494, 99302, 44733, 40242, 49555, 13934, 44011, 88920],
     'Country': ['USA', 'USA', 'USA', 'France', 'France', 'France', 'China', 'China', 'Japan', 'Japan', 'France'],
     'Region': ['America', 'America', 'America', 'Europe', 'Europe', 'Europe', 'Asia', 'Asia', 'Asia', 'Asia', 'Europe']})
recordsgraph = records.pivot(columns='Region', values='salary')
ax = recordsgraph.plot.density()
ax.yaxis.set_major_formatter(FuncFormatter(percentage_base_5000))
ax.set_ylabel('Percentage for a 5000-range salary')
plt.tight_layout()
plt.show()

结果图

请注意,a 的副作用FuncFormatter是状态栏中显示的值将获得相同的转换。因此,光标值x=3.67e4 y=11.7 %表示工资在 36700-2500 和 36700+2500 之间的估计概率约为 11.7%。


推荐阅读