2016-10-24 2 views
0

Цель состоит в том, чтобы цветное значение выше определенного порогового значения в один цвет и значения ниже этого порога в другой цвет. Приведенный ниже код пытается просто разделить его на две гистограммы, но он выглядит сбалансированным только в том случае, если порог составляет 50%. Я предполагаю, что должен играть с переменной discreetlevel.Графическое распределение графиков Matplotlib с двумя цветами

finalutilityrange - это вектор с кучей значений (вы должны сгенерировать его для проверки кода), который я пытаюсь выполнить. Значение deter - это значение, определяющее, будут ли они синими или красными. discreetlevel - это просто количество ящиков, которые я бы хотел.

import random 
import numpy as np 
import matplotlib.pyplot as plt 

discreetlevel = 10 
deter = 2 

for x in range(0,len(finalutilityrange)): 
    if finalutilityrange[x-1]>=deter: 
     piraterange.append(finalutilityrange[x-1]) 
    else: 
     nonpiraterange.append(finalutilityrange[x-1]) 

plt.hist(piraterange,bins=discreetlevel,normed=False,cumulative=False,color = 'b') 
plt.hist(nonpiraterange,bins=discreetlevel),normed=False,cumulative=False,color = 'r') 
plt.title("Histogram") 
plt.xlabel("Utlity") 
plt.ylabel("Probability") 
plt.show() 
+0

Не часть вашего вопроса, но ваш for-loop реализован неправильно. Это ваша удача, что Python интерпретирует 'finalutilityrange [-1]' вместо повышения ошибки. –

+0

Спасибо за правильность! – Dio

ответ

0

Этот ответ не решает код, так как он не является самодостаточным, но за то, что вы пытаетесь сделать гистограмму по умолчанию должны работать (при условии, NumPy/pyplot загружена)

x = randn(100) 
idx = x < 0.2 # Threshold to separate values 
hist([x[idx], x[~idx]], color=['b', 'r']) 

Пояснение:

  1. первая строка просто создает некоторые случайные данные, чтобы проверить,
  2. создает индекс для того, где данные ниже некоторого порогового значения, это может быть отрицается с ~, чтобы найти, где он выше порогового значения
  3. Последняя строка отображает гистограмму. Команда принимает список отдельных групп сюжет, который не делает большой разницы здесь, но если normed=True это

Там больше хист сюжет может сделать, так что смотрите по документации, прежде чем вы случайно реализовать его самостоятельно ,

+0

Пожалуйста, покажите некоторые импорты или используйте квалифицированные имена –

+0

@ user2699 Спасибо, что работает! Вопрос: что именно происходит? И почему-то есть расщепление графика между цветами, любая идея почему? Бар отсутствует прямо между красными и синими цветами ... – Dio

+0

Это потому, что ваш порог разделения не выровнен по отношению к ячейкам одной или обеих гистограмм. –

1

Это решение немного сложнее, чем @ user2699. Я просто представляю его для полноты. У вас есть полный контроль над объектами патча, которые возвращает hist, поэтому, если вы можете убедиться, что порог, который вы используете, находится точно на краю корзины, легко изменить цвет выбранных патчей. Вы можете это сделать, потому что hist может принимать последовательность краев бункера как параметр bins.

import numpy as np 
from matplotlib import pyplot as plt 

# Make sample data 
finalutilityrange = np.random.randn(100) 
discreetlevel = 10 
deter = 0.2 

# Manually create `discreetlevel` bins anchored to `deter` 
binsAbove = round(discreetlevel * np.count_nonzero(finalutilityrange > deter)/finalutilityrange.size) 
binsBelow = discreetlevel - binsAbove 
binwidth = max((finalutilityrange.max() - deter)/binsAbove, 
       (deter - finalutilityrange.min())/binsBelow) 
bins = np.concatenate([ 
      np.arange(deter - binsBelow * binwidth, deter, binwidth), 
      np.arange(deter, deter + (binsAbove + 0.5) * binwidth, binwidth) 
]) 

# Use the bins to make a single histogram 
h, bins, patches = plt.hist(finalutilityrange, bins, color='b') 

# Change the appropriate patches to red 
plt.setp([p for p, b in zip(patches, bins) if b >= deter], color='r') 

В результате гомогенный гистограмма с бункерами разных цветов:

enter image description here

Бункера могут быть немного шире, чем если бы вы не якорь на deter. Либо первый, либо последний бит обычно будет немного отставать от края данных.

+0

@Mad_Physicist Немного смущен, что такое x? – Dio

+0

@ Dio. Спасибо за уловку.'x' - это переменная, которую я имел в рабочей области, которую я тестировал, в том, что я забыл перейти на' finalutilityrange'. Исправлено. –

+0

Также обновлено это понимание списка в конце. Обратите внимание, что 'setp' имеет небольшую проблему с произвольными итерами, которые не являются списками, которые были исправлены, но пока еще не доступны в официальных версиях 1.5. –

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