【发布时间】:2022-01-04 08:08:16
【问题描述】:
我正在尝试通过分组在一些数据上绘制散点图。它们按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 个组。但这是丑陋的 IMO 逐行循环遍历 DataFrame 和我坚信有更好的方法。
提前致谢!
【问题讨论】:
-
我尝试查看列表中是否可以支持各种散点图标记,但似乎仍然不可能。最好的方法是使其成为一个函数,如this answer 中所述。
-
作为替代方案,如果您使用 Seaborn,则以下代码可以解决问题。
sns.scatterplot(x=df["index"], y=df["data"], c=df["color"],style=df['marker']) -
@r-beginners Lemme 看看 Seaborn :D
标签: python pandas dataframe matplotlib