【问题标题】:Even distribution of percentile labels on x axisx 轴上百分位标签的均匀分布
【发布时间】:2017-05-13 00:58:02
【问题描述】:

请原谅我的术语,我不是统计或绘图方面的专家!

使用 Pandas,我正在尝试绘制分位数数据,这些数据被存储到“5 个 9s”。也就是说,对于给定的 DataFrame 'df',它具有一系列 'foo' 不均匀分布的整数值:

q = df['foo'].quantile([.1, .2, .3, .4, .5, .6, .7, .8, .9, .99, .999, .9999, .99999, 1])
q.plot()

导致绘图中 0.9 和 1.0 之间的 x 轴间隔被压缩:

有没有办法在 x 轴上均匀分布分位数桶?

谢谢!

【问题讨论】:

  • 一种可能性是设置一个新变量,它是分位数桶的 1-1 映射,但从 1 到 n 计数,其中 n 是桶的数量。生成以 this 作为 x 轴的图形,然后添加分位数作为标签。
  • lmo,如果您想将此更改为答案,我会给您功劳-您的建议有效。谢谢。
  • 如果您想发布您的代码作为答案,那很好。我现在有点心事重重。只需在最后添加对建议或类似内容的快速感谢即可。如果您在发布时告诉我,我会给您一个赞成票。否则,我会在这个周末尝试一下。

标签: python pandas matplotlib plot quantile


【解决方案1】:

我会使用pd.qcut

示例

import pandas as pd
import numpy as np

a = np.sort(np.random.rand(1000))
b = a.repeat(np.arange(len(a)))
b += np.random.rand(len(b)) / 100
s = pd.Series(b)

s.hist()

你想要这个
使用任何你想要的垃圾箱。我用了 20。我还传递了一个标签参数。没有它,pandas 将在切割处的边缘标记。

q = pd.qcut(s, 20, labels=range(20))

【讨论】:

  • 不幸的是,我的数据分布不够,无法避免非唯一的 bin 边缘。无论如何,我需要能够显示 N 9 的精度高于第 90 个百分位。也许我不完全理解你的回答。
【解决方案2】:

听取 lmo 的建议,这是适合我的解决方案。

对于具有系列“A”的给定数据框“df”:

percentiles = [.1, .2, .3, .4, .5, .6, .7, .8, .9, .99, .999, .9999, .99999, 1.0]

pct = df['A'].quantile(percentiles)
xticks = range(0, len(percentiles), 1)
ax = pct.plot (xticks=xticks)
ax.set_xticklabels([str(p) for p in percentiles)
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多