簡體   English   中英

當一些垃圾箱主導其他垃圾箱時如何繪制直方圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM