Python 根据两个数据框值对绘图进行颜色编码

Python 根据两个数据框值对绘图进行颜色编码,python,pandas,matplotlib,scatter-plot,color-scheme,Python,Pandas,Matplotlib,Scatter Plot,Color Scheme,我想根据两个数据帧值对散点图进行颜色编码,这样对于df[1]的每个不同值,将分配一种新颜色,对于具有相同df[1]值的每个df[2]值,先前分配的颜色需要df[2]值最高的不透明度变化(在具有相同df[1]值的df[2]值中)在数据点组中,获得100%不透明和最低不透明 代码如下: def func(): ... df = pd.read_csv(PATH + file, sep=",", header=None) b = 2.72 a = 0.00000009

我想根据两个数据帧值对散点图进行颜色编码,这样对于df[1]的每个不同值,将分配一种新颜色,对于具有相同df[1]值的每个df[2]值,先前分配的颜色需要df[2]值最高的不透明度变化(在具有相同df[1]值的df[2]值中)在数据点组中,获得100%不透明和最低不透明

代码如下:

def func():
    ...

df = pd.read_csv(PATH + file, sep=",", header=None)


b = 2.72
a = 0.00000009

popt, pcov = curve_fit(func, df[2], df[5]/df[4], p0=[a,b])

perr = np.sqrt(np.diag(pcov))

plt.scatter(df[1], df[5]/df[4]/df[2])
# Plot responsible for the datapoints in the figure

plt.plot(df[1], func_cpu(df[2], *popt)/df[2], "r")
# plot responsible for the curve in the figure

plt.legend(loc="upper left")
以下是示例数据集:

**df[0],df[1],df[2],df[3],df[4],df[5],df[6]**

file_name_1_i1,31,413,36120,10,9,10
file_name_1_i2,31,1240,60488,10,25,27
file_name_1_i3,31,2769,107296,10,47,48
file_name_1_i4,31,8797,307016,10,150,150
file_name_2_i1,34,72,10868,11,9,10
file_name_2_i2,34,6273,250852,11,187,196
file_name_3_i1,36,84,29568,12,9,10
file_name_3_i2,36,969,68892,12,25,26
file_name_3_i3,36,6545,328052,12,150,151
file_name_4_i1,69,116,40712,13,25,26
file_name_4_i2,69,417,80080,13,47,48
file_name_4_i2,69,1313,189656,13,149,150
file_name_4_i4,69,3009,398820,13,195,196
file_name_4_i5,69,22913,2855044,13,3991,4144
file_name_5_i1,85,59,48636,16,47,48
file_name_5_i2,85,163,64888,15,77,77
file_name_5_i3,85,349,108728,16,103,111
file_name_5_i4,85,1063,253180,14,248,248
file_name_5_i5,85,2393,526164,15,687,689
file_name_5_i6,85,17713,3643728,15,5862,5867
file_name_6_i1,104,84,75044,33,137,138
file_name_6_i2,104,455,204792,28,538,598
file_name_6_i3,104,1330,513336,31,2062,2063
file_name_6_i4,104,2925,1072276,28,3233,3236
file_name_6_i5,104,6545,2340416,28,7056,7059
...
因此,
x
-轴将是
df[1]
,它们是
31,31,31,34,34,
y
-轴是
df[5],df[4],df[2]
,它们是
9,10,413
。对于
df[1]
的每个不同值,需要指定一种新颜色。重复6种独特颜色后的颜色循环是可以的。在每种颜色中,不透明度都需要更改为
df[2]
(虽然
y
-轴是
df[5],df[4],df[2]
)。最高的获得相同颜色的较深版本,最低的获得相同颜色的最浅版本

散点图:

这大致就是我想要的颜色代码解决方案的样子:

我在csv文件中有大约200个条目


在这种情况下使用NumPy更有利吗?

请告诉我这是否合适,或者我是否误解了什么-

将熊猫作为pd导入
将matplotlib.pyplot作为plt导入
将numpy作为np导入
#你不需要
#df=pd.read\u csv(“~/Documents/tmp.csv”)
max_2=pd.DataFrame(df.groupby('1').max()
无唯一颜色=3
颜色集合=[np.random.random((3))表示范围内的(无唯一颜色)]
#按循环顺序为唯一的df2指定颜色
max_2['colors']=[color_set[unique_df2%no_unique_colors]用于范围内的unique_df2(max_2.shape[0])]
#计算数据帧中每个条目的不透明度
colors=[list(max_2.loc[df1].colors)+[float(df['2'].iloc[i])/max_2['2'].loc[df1]]for i,枚举中的df1(df['1'])]
#重复三次,使df2、df4和df5共享相同的不透明度
颜色=[x代表x,颜色代表uu范围(3)]
plt.scatter(df['1']值。重复(3),df['2','4','5']]值。重塑(-1),c=颜色)
plt.show()

嗯,你知道些什么。我对这项任务的理解完全不同。我认为重点是根据所有
df[2]
df[4]
df[5]
值为每个
df[1]
值设置alpha水平。哦,既然我已经完成了工作,为什么不发布呢

from matplotlib import pyplot as plt
import pandas as pd
from itertools import cycle
from matplotlib.colors import to_rgb

#read the data, column numbers will be generated automatically
df = pd.read_csv("data.txt", sep = ",", header=None)

#our figure with the ax object
fig, ax = plt.subplots(figsize=(10,10))
#definition of the colors
sc_color = cycle(["tab:orange", "red", "blue", "black"])

#get groups of the same df[1] value, they will also be sorted at the same time
dfgroups = df.iloc[:, [2, 4, 5]].groupby(by=df[1])

#plot each group with a different colour
for groupkey, groupval in dfgroups:
    #create group dataframe with df[1] value as x and df[2], df[4], and df[5] values as y
    groupval= groupval.melt(var_name="x", value_name="y")
    groupval.x = groupkey
    
    #get  min and max y for the normalization
    y_high = groupval.y.max()
    y_low = groupval.y.min()
    #read out r, g, and b values of the next color in the cycle
    r, g, b = to_rgb(next(sc_color))
    #create a colour array with nonlinear normalized alpha levels 
    #between 0.2 and 0.8, so that all data point are visible
    group_color = [(r, g, b, 0.19 + 0.8 * ((y_high-val) / (y_high-y_low))**7) for val in groupval.y]
    #and plot
    ax.scatter(groupval.x, groupval.y, c=group_color)
    
    
plt.show()
数据的示例输出:

这里有两个主要问题。一个是散点图中的
alpha
不接受数组。但是,因此,color需要绕道读取RGB值并创建一个带有附加alpha级别的RGBA数组。

另一个原因是,您的数据分布范围相当广。线性规格化使接近最低值的更改不可见。当然有一些优化的可能;例如,我喜欢。

@T先生,很抱歉这个问题的框架有误。。在拥有6种独特的颜色后,可以重复颜色循环,并在那里重复图案after@Mr.T谢谢你的建议。我现在给问题添加了一个样本数据集。x轴应该是df[1],它是31,31,31,34,34,。。。。。y轴为df[5]/df[4]/df[2],即(9/10/413),……对于df[1]的每个不同值,需要指定一种新颜色。@T先生,我很抱歉。。我不熟悉stack overflow,谢谢你的建议。。我已经根据OP更新了问题,颜色由df['2']的值决定,因此在
df['2']、df['4']、df['5']
中,共享相同alpha值的一个可能会更高。我可以限制颜色,但OP的帖子让它听起来像是一个选项(如果强制的话,将颜色限制为6应该不难),这是一个很好的观点,但在这200个条目中,独特的df2的数量是不是很重要?此外,更新了3种不同颜色的代码,仅显示循环性质亲爱的@sai非常感谢您的回答。颜色由df[1]决定(在我们的例子中是x轴),这些颜色的不透明度由df[2]值决定,最高的df[2]值在该颜色的瞬间变得更厚(更高的alpha值接近1)。不透明度的df[2]值之间的比较仅在具有相同df[1]值的条目之间,这是一个关键错误,尝试打印df.columns并使用列名准确访问它们。更好的是,只需重命名它们
df.columns=['0','1','2','3','4','5','6']