最近在处理数据,为了方便展示,需要绘制柱状图进行可视化。数据类似对数正态分布,即数据值越接近均值,数据越多,反之距离均值越远,数据量越少,形式类似于下图,可以看到,大部分数据落在0~10以内,大于10的部分我们不太关心。
import numpy as np
import matplotlib.pyplot as plt
a = np.random.lognormal(0,1,10000)
plt.hist(a, bins=20, edgecolor='black')
plt.show()
那么,如果只需要展示0~10的数据,我们可以通过bins设置坐标轴范围来解决,但这样就完全丢失了大于10的数据,有什么方法可以既显示0~10的数据,又不损失大于10的数据呢?
查阅资料发现,可以使用numpy的np.clip()来实现,该方法可以将数据限制在指定的范围内,举例来说:
>>> a=np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.clip(a,0,5)
array([0, 1, 2, 3, 4, 5, 5, 5, 5, 5])
于是可以用np.clip()处理超出坐标范围的数据,代码如下:
import numpy as np
import matplotlib.pyplot as plt
a = np.random.lognormal(0,1,10000)
x_min, x_max, step = 0, 10, 1
x_range = np.arange(x_min - step, x_max + 2*step, step)
x_label = np.concatenate((np.array([r'$-\infty$']), np.arange(x_min, x_max + step, step), np.array([r'$+\infty$'])))
b = np.clip(a, x_min - step, x_max + step)
plt.hist(b, bins=x_range, edgecolor='black')
plt.xticks(x_range, labels=x_label)
plt.show()
最终实现的效果如下,在抓住重点数据的同时,也没有使数据量有损失
参考: