2013-11-30 1 views
0

Я хотел бы нарисовать гистограмму, которая объясняет, как распределяются данные. Моя проблема в том, что большинство данных имеют очень маленькие значения. Следовательно, если вы используете 10 бункеров, это будет не так описательно; большая часть данных сжимается в 0.0-0.1 bin. Если вы используете 1000 ящиков, то гистограмма выглядит не очень хорошо из-за xlabels , и некоторые бункеры перекрывают другие, так как у нас слишком много бункеров.Как нарисовать гистограмму, когда некоторые бункеры доминируют над остальными

Я попытался использовать, например, нормированную версию в масштабе журнала, но все же я не смог получить информативную гистограмму. Я уже вычислил (1000) ящики и подсчеты. Ниже приведен код для чтения данных. Вы можете запустить его: ./sub-histogram.py hist-data.txt 2500 0. 0 означает, что вы используете необработанные счетчики (первая строка). Последняя строка содержит значения bin.

Первой идеей является слияние счетчиков и бункеров с некоторым порогом. Если подсчеты меньше определенного порога, скопируйте этот счетчик и пропустите этот бит. У меня сейчас нет никакой дополнительной идеи, но я уверен, что если вы используете гистограмму, вы столкнулись с этой проблемой. Есть ли решение для таких случаев ? Данные и все это here.

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() 
+0

Я пробовал лог, но наложения перекрывались друг с другом, даже я использовал ширину бара 0,005. План Б использует журнал, но я хотел бы услышать некоторые мысли. – Thorn

ответ

0

Я бы предложил иметь несколько ящиков для небольших значений и больше, чем в бункере, например. 100 бункеров для значений в диапазоне от 0,000 до 0,200 с интервалом 0,002 и одним ящиком для всего более 0,200 (возможно, у вас есть 10 ящиков для 0,000-0,009, десять для 0,010-0,090 и т. Д.), Тогда вам понадобится для переопределения меток по оси X, но ax.set_xticklabels позволяет это сделать.

+0

Стив, спасибо за ответ. Я создал бины 'bins = np.linspace (0, 0.009, 10) .tolist() + np.linspace (0.01, 0.09, 10) .tolist() + np.linspace (0.1, 1, 2) .tolist () '. Теперь мне нужно перебрать все значения и добавить каждое значение в правый бит. Но как я могу заставить plt делать все это? (Кстати, я не понимаю 'ax.set_xticklabels'. Что такое' ax'?) – Thorn

+0

Кстати, код выше делает аналогичную вещь с нефиксированными ячейками, но с порогом. Однако это выглядит не очень хорошо. – Thorn

+0

http://matplotlib.org/examples/api/barchart_demo.html дает вам демонстрацию использования пользовательских меток осей для гистограмм. –

Смежные вопросы