【问题标题】:Visualizing third variable with MatplotLib Histograms使用 MatplotLib 直方图可视化第三个变量
【发布时间】:2020-12-02 11:32:04
【问题描述】:

请原谅我的英语不好。

在像下面这样的 DataFrame 上:

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

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

我正在寻找一个直方图,显示根据 var1 有多少行。

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

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

我试图对此进行硬核,但是一旦我更改了垃圾箱或其他任何东西,我的代码就会中断。

我也尝试使用 hist 顶部的 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')

我觉得这是很简单的事情,但我因此完全陷入了学习中。

非常感谢您的帮助。

【问题讨论】:

    标签: python matplotlib jupyter-notebook data-science


    【解决方案1】:

    如果您为直方图中的每个条创建一个包含颜色的列表,您可以使用以下代码 sn-p。它捕获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()
    

    【讨论】:

    • 不仅你的代码是完美的,而且因为你的cmets,我明白了一切。这是我在stackoverflow上收到的最好的答案!谢谢!!
    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    相关资源
    最近更新 更多