[英]How to draw histogram with same bins width for unequally spaced bins in matplotlib
[英]How to draw a histogram when some bins dominate the others
我想繪制一個直方圖來解釋數據的分布方式。 我的問題是,大多數數據的值都非常小。 因此,如果您使用10個垃圾箱,它的描述性就不會那么高。 大多數數據都壓縮在0.0-0.1 bin中。 如果使用1000個bin,則由於xlabel的原因,直方圖看起來不太好,並且由於我們的bin太多,某些bin與其他bin重疊。
我也嘗試使用對數刻度,歸一化版本,但仍然無法獲得有用的直方圖。 我已經計算了(1000)個垃圾箱和計數。 讀取數據的代碼如下。 您可以運行它: ./sub-histogram.py hist-data.txt 2500 0
。 0表示您使用原始計數(第一行)。 最后一行包含bin值。
第一個想法是將計數和容器合並到某個閾值。 如果計數小於某個閾值,則累加該計數並跳過此bin。 我目前沒有任何進一步的想法,但是我敢肯定,如果您使用直方圖,那么您會遇到這個問題。 對於這種情況有什么解決辦法嗎? 數據和一切都在這里 。
import sys
from itertools import izip
import matplotlib.pyplot as plt
import numpy as np
lines = open(sys.argv[1]).readlines()
threshold = float(sys.argv[2])
count_type = int(sys.argv[3]) # 0 for raw counts, 1 for normalized counts, 2 for log counts
# reading
C = map(float, lines[count_type][1:-2].replace(",", "").split())
B = map(float, lines[3][1:-2].replace(",", '').split())
# merging method.
# accumulate the counts with respect to threshold.
counts = []
bins = []
ct = 0
for c, b in izip(C,B):
ct += c
if ct >= threshold:
counts.append(ct)
bins.append(b)
ct = 0
if ct > 0:
counts.append(ct)
bins.append(b)
ct = 0
print counts
print bins
bar_width= 0.005
plt.xticks(np.linspace(0,2,41))
plt.bar(bins, counts, bar_width)
plt.show()
我建議為您的小值設置多個bin,大於bin,例如,對於0.000至0.200范圍內的值,間隔為0.002,設置100個bin,對於超過0.200的所有對象,為一個bin(您可能有0.000的10個bin -0.009,0.010-0.090等十個,等等),然后需要覆蓋X軸上的標簽,但是使用ax.set_xticklabels
可以做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.