【问题标题】:Scatter plot with same colour and varying colour tone based on the data frame values基于数据框值的相同颜色和不同色调的散点图
【发布时间】:2021-02-26 21:47:40
【问题描述】:

我有一个数据集,其中两个列的数据模式类似于以下内容:

df[1] = [20,20,20,65,65,86,86,86...]

df[2]=[110,1520,11111,1322.......]

...

我正在尝试用这个数据集拟合一个模型,在这个过程中,我必须用不同的配色方案和颜色​​强度来表示数据点,以便更好地理解绘图。

剧情是这样的:

点是数据点,曲线是估计的拟合。

为了生成这个图,我在代码中编写了以下代码:

 plt.scatter(df[1], df[3]/df[2], c=df[1])

这里的值变化只是 w.r.t 到 df[1]。但我也想根据 df[2] 的值通过使用以下标准来改变不同的颜色强度:

对于相同的 df[1] 值,df[2] 的相邻值将是 相互比较。最高的将获得更多的强度 并且最低的相同颜色的强度较低。相似之处 df[1] 的其他值,颜色会改变,相邻的值 需要比较 df[2] 的颜色强度。

在我们的 df[1] 值 = 20 示例中,df[2] 值 110,1520 和 11111 将相互比较,最高的将获得最亮的色调(尽管这三个值的颜色相同)。

有人可以建议如何绘制这个吗?

【问题讨论】:

    标签: python pandas matplotlib plot scatter-plot


    【解决方案1】:

    解决问题的一个简单方法是根据 df2 值获取“颜色桶”

    这里是一个例子

    df_1 = [20, 20, 20, 30, 30, 30, 40, 40, 40]
    df_2= [100, 200, 1000, 100, 200, 1000, 100, 200, 1000]
    

    在这里我正在构建我的颜色“桶”

    my_lists = {}
    
    for i in range(len(df_2)):
        if 0<1/df_2[i]<0.005:
            if 'bucket1' not in my_lists:
                my_lists['bucket1'] = ([df_1[i]], [df_2[i]], 'darkgreen')
            else:
                my_lists['bucket1'][0].append(df_1[i])
                my_lists['bucket1'][1].append(df_2[i])
        if 0.005<=1/df_2[i]<0.010:
            if 'bucket2' not in my_lists:
                my_lists['bucket2'] = ([df_1[i]], [df_2[i]], 'limegreen')
            else:
                my_lists['bucket2'][0].append(df_1[i])
                my_lists['bucket2'][1].append(df_2[i])
        if 0.01<=1/df_2[i]<0.02:
            if 'bucket3' not in my_lists:
                my_lists['bucket3'] = ([df_1[i]], [df_2[i]], 'lime')
            else:
                my_lists['bucket3'][0].append(df_1[i])
                my_lists['bucket3'][1].append(df_2[i])
    
    
    for key, value in my_lists.items():
        plt.scatter(value[0], 1/np.array(value[1]), c=[value[2]])
    

    结果

    更多桶的更新

    my_lists = {}
    for i in range(len(df_2)):
        if 0<1/df_2[i]<0.005 and 0<df_1[i]<21:
            if 'bucket1' not in my_lists:
                my_lists['bucket1'] = ([df_1[i]], [df_2[i]], 'darkgreen')
            else:
                my_lists['bucket1'][0].append(df_1[i])
                my_lists['bucket1'][1].append(df_2[i])
        if 0.005<=1/df_2[i]<0.010 and 0<df_1[i]<21:
            if 'bucket2' not in my_lists:
                my_lists['bucket2'] = ([df_1[i]], [df_2[i]], 'limegreen')
            else:
                my_lists['bucket2'][0].append(df_1[i])
                my_lists['bucket2'][1].append(df_2[i])
        if 0.01<=1/df_2[i]<0.02 and 0<df_1[i]<21 :
            if 'bucket3' not in my_lists:
                my_lists['bucket3'] = ([df_1[i]], [df_2[i]], 'lime')
            else:
                my_lists['bucket3'][0].append(df_1[i])
                my_lists['bucket3'][1].append(df_2[i])
        if 0<1/df_2[i]<0.005 and 21<df_1[i]<31:
            if 'bucket4' not in my_lists:
                my_lists['bucket4'] = ([df_1[i]], [df_2[i]], 'blue')
            else:
                my_lists['bucket4'][0].append(df_1[i])
                my_lists['bucket4'][1].append(df_2[i])
        if 0.005<=1/df_2[i]<0.010 and 21<df_1[i]<31:
            if 'bucket5' not in my_lists:
                my_lists['bucket5'] = ([df_1[i]], [df_2[i]], 'royalblue')
            else:
                my_lists['bucket5'][0].append(df_1[i])
                my_lists['bucket5'][1].append(df_2[i])
        if 0.01<=1/df_2[i]<0.02 and 21<df_1[i]<31:
            if 'bucket6' not in my_lists:
                my_lists['bucket6'] = ([df_1[i]], [df_2[i]], 'lightsteelblue')
            else:
                my_lists['bucket6'][0].append(df_1[i])
                my_lists['bucket6'][1].append(df_2[i])
        if 0<1/df_2[i]<0.005 and 31<df_1[i]<41:
            if 'bucket7' not in my_lists:
                my_lists['bucket7'] = ([df_1[i]], [df_2[i]], 'darkred')
            else:
                my_lists['bucket7'][0].append(df_1[i])
                my_lists['bucket7'][1].append(df_2[i])
        if 0.005<=1/df_2[i]<0.010 and 31<df_1[i]<41:
            if 'bucket8' not in my_lists:
                my_lists['bucket8'] = ([df_1[i]], [df_2[i]], 'firebrick')
            else:
                my_lists['bucket8'][0].append(df_1[i])
                my_lists['bucket8'][1].append(df_2[i])
        if 0.01<=1/df_2[i]<0.02 and 31<df_1[i]<41:
            if 'bucket9' not in my_lists:
                my_lists['bucket9'] = ([df_1[i]], [df_2[i]], 'lightcoral')
            else:
                my_lists['bucket9'][0].append(df_1[i])
                my_lists['bucket9'][1].append(df_2[i])
    
    
    for key, value in my_lists.items():
        plt.scatter(value[0], 1/np.array(value[1]), c=[value[2]])
    

    【讨论】:

    • 感谢您的建议。在我的案例中,数据集有更多条目,对于 df[1] 的不同值和 X ( df[1]) 的每个值,我需要不同的颜色,对应的需要比较 df[2] 的值,然后最高值的点需要获得更多相同颜色的强度
    • 所以,有两个变量值 df[1] 和 df[2] 分别决定颜色和它们的强度
    • @ranjith 你可以简单地指定更多的桶颜色。更改您的 if 条件也适用于 df[1] 中的范围。检查我的更新
    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 2021-10-11
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2020-09-24
    相关资源
    最近更新 更多