如何在Python3中使用自定义的下溢/上溢箱绘制刻面直方图?

时间:2020-04-15 17:23:08

标签: python python-3.x pandas matplotlib seaborn

我有一个带有几列(区域,日期,利润)的熊猫数据框。我想要一个按地区和日期划分的利润直方图。但是利润栏数据的两端都有很长的尾巴,这意味着有5个利润少于10美元的计数和280483个利润在400-450美元之间的计数,然后有6个利润大于10万美元的计数。

我想做的是创建一个带有自定义垃圾箱的直方图,以便它显示多个垃圾箱,价格为$ 400- $ 450,只有一个垃圾箱,价格为$ 400以下,一个垃圾箱,价格为$ 450以上,希望直方图中的列是在相同宽度之上。

我现在所拥有的:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
fixed_bin = list(np.arange(400,450,5))
fixed_bin.insert(0,0)
fixed_bin.append(150000)
fig = sns.FacetGrid(df, col = 'region', row = 'date',
                    margin_titles = True, aspect = 1.4)
fig.map(sns.distplot, 'profit', kde = False, bins = fixed_bin, color = 'r')

但是,这给了我一个从0到150000的均匀分布的X轴。我的所有数据(介于400-450之间)仍然被压缩在中间,很难看到该中间部分的真实直方图。如何将两端的尾巴(下溢和溢流箱)变成两个小箱,它们的宽度与中间箱的宽度相同?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我的第一个想法是分别进行装仓和绘图。 但是我找不到matplotlib.pyplot.barseaborn.barplot的报价 自定义垃圾箱大小。

所以我们必须欺骗seaborn.distplotmatplotlib.pyplot.hist (其背后的功能)。

import numpy as np

import seaborn as sns
import matplotlib.pyplot as plt

# add another bin to dump all overflow values
# same size as the others
fixed_bin = list(np.arange(400, 455, 5))

# add another bin to dump all underflow values
# same size as the others
fixed_bin.insert(0, 395)

print(fixed_bin)

some_upper_boundary = 500

data = np.random.randint(300, high=some_upper_boundary, size=1000)

# use boolean indexing do move the data from 450 to 150000 into the
# last bin

in_first_bin = np.logical_and(data >= 0, data < 400)
in_last_bin = np.logical_and(data > 450, data <= some_upper_boundary)

data[in_first_bin] = 397
data[in_last_bin] = 447

#print(data)
ax = sns.distplot(data, bins=fixed_bin)


# Set the tick positions
ax.set_xticks(fixed_bin)

my_custom_ticklabels = list(map(str, fixed_bin))
print(my_custom_ticklabels)

my_custom_ticklabels[0] = 'under\nflow'
my_custom_ticklabels[-1] = 'over\nflow'

# Set the tick labels
ax.set_xticklabels(my_custom_ticklabels)

plt.show()

稍后我将添加一些格式:

  • 在图上添加自定义刻度标签。最后一个垃圾箱可能是“之后”。
  • 对第一个垃圾箱执行相同的操作,并将标签调整为“之前”。

enter image description here