matplotlib 如何按数据框列分配散点标记?如何避免TypeError:不可哈希类型:从dataframe创建字符串数组时的“Series”?

brjng4g3  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(70)

我尝试按年份(数据框列)散点图数据,并按使用的检测器(数据框列)分配标记类型。下面的代码生成错误“TypeError”:不可哈希类型:'Series'';我的理解是因为我为分散标记创建的字符串数组引用了一个可变的 Dataframe ,而不是复制它的数据,但是如果是这样,我如何复制而不是引用来获得独立的向量分散需要?我应该使用什么代码来代替呢?

import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_excel("..\data.xlsx")
fig, ax = plt.subplots()
for Year in range(2019, 2024):
    x = data.Cone[(data.Energy==12) & (data.Year == Year)]
    y = data.CalcOverCom[(data.Energy==12) & (data.Year == Year)]
    strings = data.detector[(data.Energy==12) & (data.Year == Year)]
    strings[strings=='semiflex'] = '.'
    strings[strings=='diamond'] = 'd'
    strings[strings=='NaN'] = '1'
    plt.scatter(x, y, marker=strings, label=Year)
ax.set_xlabel('xlabel')
ax.set_ylabel('ylabel')
ax.legend(bbox_to_anchor=(1, 1))
ax.set_title('title')
plt.show()

字符串
我试过了
1.循环中的if-elseif-else块来创建标记规范
1.创建一个单独的字符串向量来使用循环的每次迭代
即使我用这些方法创建了一个数组,并列出了正确的标记类型,代码也会因为神秘的“不可散列”TypeError而无法执行。

gorkyyrv

gorkyyrv1#

从注解中可以看出,matplotlib文档指定scatter函数必须使用单个字符串,即使它链接到一个通用的标记样式页面,该页面提到了一个类似数组的输入。
可以使用seaborn软件的scatterplot函数,并使用“unknown”填充空白Excel单元格,以使用此字符串作为标记规范和图例标签。Seaborn不允许“1”标记与其他实心标记一起使用,因此将其替换为另一个实心标记“s”:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

QAdata = pd.read_excel("..\Excel-file-in-parent-directory.xlsx")
sns.scatterplot(data=QAdata[QAdata.Energy==12], x='Cone', y='CalcOverCom', hue='Year',
                style='detector', markers=['.','d','s'],
                style_order=['semiflex', 'diamond','unknown'])
plt.xlabel('xlabel text')
plt.ylabel('ylabel text')
plt.title('title text')
plt.show()

字符串

相关问题