【问题标题】:Create map of histogram with relative frequency创建具有相对频率的直方图地图
【发布时间】:2019-12-20 17:03:51
【问题描述】:

我有一个带有变量“x”和“标志”的数据框,如下所示:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import random

x_a = [np.random.normal() for y in range(10**4)]
x_b = [np.random.normal() for y in range(10**3)]
#x_c = [np.random.normal() for y in range(10**2)] # in this case density=True works fine
x_c = [random.choice([0, 1, 2]) for y in range(10**2)] # in this case density=True doesn't work

x = x_a + x_b + x_c

flag_a = ['a' for y in range(10**4)]
flag_b = ['b' for y in range(10**3)]
flag_c = ['c' for y in range(10**2)]
flag = flag_a + flag_b + flag_c

df = pd.DataFrame({'x': x, 'flag': flag})
df.head()

            x   flag
0    1.311679   a
1   -1.096678   a
2    0.118205   a
3    1.364317   a
4    0.542725   a

我想为每个标志绘制 x 的直方图,尝试使用

g = sns.FacetGrid(df, col='flag')
g.map(plt.hist, 'x', bins=20)

导致

虽然我想要相对频率,以便比较具有不同计数的标志之间的分布。

请注意density=True 没有帮助。

g = sns.FacetGrid(df, col='flag')
g.map(plt.hist, 'x', bins=20, density=True)

给予

当垃圾箱真的很“薄”时,它们会变得非常高,并且垂直轴大于 1。我不想要它,因为我希望最大值为 1 = 100%。

【问题讨论】:

  • 我还是不明白为什么density=True 不是你想要的……纵轴的值>1 很好;这只是反映了您的 x 轴的单位,因为要求概率密度(曲线下的面积)为 1。
  • 感谢您的解释,我不明白为什么我的垂直轴值大于 1。我仍然不想要它们,因为我预计最大频率为 1 或 100%。
  • 是的,这有点不幸你曾经可以使用normed=True 来做到这一点,尽管density=True 已被弃用。我想您仍然可以这样做,尽管您面临警告。我想可以通过手动绘制和调整从np.hist 返回的条形高度,尽管这并不简单。

标签: python pandas matplotlib seaborn


【解决方案1】:

如果您需要为此使用seaborn,那么您需要在创建FacetGrid (link) 时将sharey 设置为False。所以改变

g = sns.FacetGrid(df, col='flag')

g = sns.FacetGrid(df, col='flag', sharey=False)

你会得到

对于np.random.normal()

对于带有np.random.choice([0, 1, 2]) 的那个。应该使用density=Truedensity=False

替代方法是直接创建轴对象,如果您需要对其创建和缩放等进行更精细的控制...

fig, axs = plt.subplots(ncols=3, figsize=(12, 4))
flags = ['a', 'b', 'c']

for ax, flag in zip(axs, flags):
    h = max(np.histogram(df[df['flag'] == flag]['x'].values, bins=20)[0])
    ax.hist(df[df['flag'] == flag]['x'].values, bins=20)
    ax.set_ylim([0, h*1.1])

plt.show()

【讨论】:

  • 谢谢,我没想到sharey=False。我仍在努力,因为我想在 y 轴上显示频率百分比。也许我需要更改 y 刻度标签,在第一个刻度标签上显示总计数,例如“1.000 = 100%”。
猜你喜欢
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 2022-10-14
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多