我尝试按年份(数据框列)散点图数据,并按使用的检测器(数据框列)分配标记类型。下面的代码生成错误“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而无法执行。
1条答案
按热度按时间gorkyyrv1#
从注解中可以看出,matplotlib文档指定
scatter
函数必须使用单个字符串,即使它链接到一个通用的标记样式页面,该页面提到了一个类似数组的输入。可以使用seaborn软件的
scatterplot
函数,并使用“unknown”填充空白Excel单元格,以使用此字符串作为标记规范和图例标签。Seaborn不允许“1”标记与其他实心标记一起使用,因此将其替换为另一个实心标记“s”:字符串