我正在尝试绘制一个带有分组的散点图。它们是按列
"本来可以工作的,但不行..."
我可以使用
group
分组的,我希望它们基于不同的组具有不同的标记样式。
最小工作代码
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
colors = ['r','g','b','y']
markers = ['o', '^', 's', 'P']
df = pd.DataFrame()
df["index"] = list(range(100))
df["data"] = np.random.randint(100, size=100)
df["group"] = np.random.randint(4, size=100)
df["color"] = df.apply(lambda x: colors[x["group"]], axis=1)
df["marker"] = df.apply(lambda x: markers[x["group"]], axis=1)
plt.scatter(x=df["index"], y=df["data"], c=df["color"])
# What I thought would have worked
# plt.scatter(x=df["index"], y=df["data"], c=df["color"], marker=df["marker"])
plt.show()
我想要什么
我希望不同的分组有不同的标记样式。例如,红色条目将具有标记“o”(大点),绿色条目将具有标记“^”(向上三角形)等。
我尝试了什么
我认为
plt.scatter(x=df["index"], y=df["data"], c=df["color"], marker=df["marker"])
"本来可以工作的,但不行..."
TypeError: 'Series' objects are mutable, thus they cannot be hashed
我可以使用
for
循环遍历 DataFrame,并按其 group
对条目进行分组。然后使用设置为定义的列表的 marker
参数来绘制它们(例如 plt.scatter(..., marker=markers[group])
)。这将导致 4 个 plt.scatter(...)
,因为总共有 4 个组。但是,在我看来,逐行循环 DataFrame 是不好看的,我坚信有更好的方法。
提前致谢!
sns.scatterplot(x=df["index"], y=df["data"], c=df["color"],style=df['marker'])
- r-beginners