【发布时间】: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