Визуализация третьей переменной с помощью гистограмм MatplotLib

#python #matplotlib #jupyter-notebook #data-science

#питон #matplotlib #jupyter-записная книжка #наука о данных

Вопрос:

Извините за мой плохой английский.

В фрейме данных, подобном следующему :

 -----------------
|index|var1|var2|
-----------------
 

существует много строк
var1 находится в диапазоне от 0 до 4000
значение var2 находится в диапазоне от -100 до 100

Я хочу создать гистограмму, которая показывает, сколько строк существует в соответствии с var1.

введите описание изображения здесь

На оси Y мы можем видеть, сколько существует строк, например, для 0> var1 < 500 имеется почти 500 тыс. строк.

Теперь я хочу добавить var2, которые показывают качество строки. Я хочу, чтобы, например, гистограмма стала синей от 0 до 500 и другого цвета от 500 до 1000 в зависимости от значения var2 (например, если строка в виде значений, где среднее значение var2 равно 100, сделайте ее зеленой, если среднее значение равно 0, сделайте его красным).

Я пытался сделать это хардкорно, но как только я меняю ячейки или что-то в этом роде, мой код ломается.

Я также пытался сделать это, используя график в верхней части списка, но это не сработало.

Мой текущий код для скриншота :

 plt.hist(var1, bins=10, range=(0,4000), color='orange', alpha=0.7)
plt.title('Var 1',weight='bold', fontsize=18)
plt.yticks(weight='bold')
plt.xticks(weight='bold')
 

Я чувствую, что это простые вещи, но из-за этого я полностью застрял в своем обучении.

Большое спасибо за вашу помощь.

Ответ №1:

Если вы создаете список, содержащий цвета для каждой полосы в вашей гистограмме, вы можете использовать следующий фрагмент кода. Он улавливает возвращаемые значения plt.hist команды, которые включают отдельные исправления. Цвет можно задавать индивидуально при повторении этих исправлений.

 n, bins, patches = plt.hist(var1, bins=8, range=(0,4000), color="orange", alpha=0.7)
for i, patch in enumerate(patches):
    plt.setp(patch, "facecolor", colors[i])
 

Кроме того, вот один из возможных способов создания упомянутой color list переменной на основе имеющихся у вас данных:

 import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# create random values and store them in a DataFrame
y1 = np.random.randint(0,4000, 50)
y2 = np.random.randint(-100, 101, 50)
y = zip(y1,y2)
df = pd.DataFrame(y, columns=["Var1","Var2"])

var1 = df["Var1"].values

# pd.cut to bin the dataframe in the appropriate ranges of Var1
# then the mean of Var2 is calculated for each bin, results are stored in a list
mean = [df.groupby(pd.cut(df["Var1"], np.arange(0, 4000 500, 500)))["Var2"].mean()]

# how to color the bars based on Var2:
# -100 <= mean(Var2) < -33: blue
# -33 <= mean(Var2) < 33: red
# 33 <= mean(Var2) < 100: green
color_bins = np.array([-100,-33,33,100])
color_list = ["blue","red","green"]

# bin the means of Var2 according to the color_bins we just created
inds = np.digitize(mean, color_bins)

# list that assigns the appropriate color to each patch
colors = [color_list[value-1] for value in inds[0]]

n, bins, patches = plt.hist(var1, bins=8, range=(0,4000), color="orange", alpha=0.7)
for i, patch in enumerate(patches):
    plt.setp(patch, "facecolor", colors[i])

plt.title('Var 1',weight='bold', fontsize=18)
plt.yticks(weight='bold')
plt.xticks(weight='bold')

plt.show()
 

Комментарии:

1. Не только ваш код идеален, но и я все понял из-за ваших комментариев. Это лучший ответ, который я когда-либо получал на stackoverflow!! Спасибо!!