Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用MatplotLib直方图可视化第三个变量_Python_Matplotlib_Jupyter Notebook_Data Science - Fatal编程技术网

Python 用MatplotLib直方图可视化第三个变量

Python 用MatplotLib直方图可视化第三个变量,python,matplotlib,jupyter-notebook,data-science,Python,Matplotlib,Jupyter Notebook,Data Science,请原谅我英语不好 在类似以下数据帧的数据帧上: ----------------- |index|var1|var2| ----------------- 有很多行 var1介于0和4000之间 var2介于-100和100之间 我希望创建一个直方图,根据var1显示有多少行 在Y轴上,我们可以看到有多少行,例如,对于0>var1

请原谅我英语不好

在类似以下数据帧的数据帧上:

-----------------
|index|var1|var2|
-----------------
有很多行 var1介于0和4000之间 var2介于-100和100之间

我希望创建一个直方图,根据var1显示有多少行

在Y轴上,我们可以看到有多少行,例如,对于0>var1<500,几乎有500k行

现在我想添加var2,它显示行的质量。 例如,我希望根据var2的值,组图从0变为蓝色,从500变为蓝色,另一种颜色从500变为1000(例如,如果条形图的值为var2的平均值为100,则将其变为绿色,如果平均值为0,则将其变为红色)

我试着对此进行硬处理,但一旦我更换了垃圾箱或其他东西,我的代码就会中断

我也试着用历史记录顶部的plot来做,但是没有用

我当前的屏幕截图代码:

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')
我觉得这是一件简单的事情,但我完全被困在我的学习,因为这一点


非常感谢您的帮助。

如果您创建了一个包含直方图中每个条颜色的列表,您可以使用以下代码段。它捕获包含单个补丁的
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])
此外,这里有一种可能的方法可以根据您拥有的数据类型创建所提到的
颜色列表

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()
将numpy导入为np
作为pd进口熊猫
将matplotlib.pyplot作为plt导入
#创建随机值并将其存储在数据帧中
y1=np.random.randint(04000,50)
y2=np.random.randint(-100101,50)
y=zip(y1,y2)
df=pd.DataFrame(y,列=[“Var1”,“Var2”])
var1=df[“var1”]。值
#pd.cut将数据帧存储在Var1的适当范围内
#然后计算每个箱子的Var2平均值,结果存储在列表中
平均值=[df.groupby(pd.cut(df[“Var1”],np.arange(04000+500500)))[“Var2”].mean()
#如何基于Var2为条形图着色:

#-100不仅你的代码是完美的,而且因为你的评论,我理解了一切。这是我在stackoverflow上收到的最好的答案!!非常感谢。