【问题标题】:How to plot scatter graph with markers based on column value [duplicate]如何根据列值绘制带有标记的散点图[重复]
【发布时间】: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


【解决方案1】:

matplotlib

IMO 逐行循环遍历 DataFrame 很丑,我坚信有更好的方法

使用 matplotlib,我认为没有比循环更好的方法了。请注意,如果您 groupby 标记,它不会逐行循环,只是逐组循环(在这种情况下为 4 次)。

这将调用plt.scatter 4 次(每个标记一次):

for marker, d in df.groupby('marker'):
    plt.scatter(x=d['index'], y=d['data'], c=d['color'], marker=marker, label=marker)
plt.legend()


海生

正如 r-beginners 评论的那样,sns.scatterplot 通过style 支持多个标记:

sns.scatterplot(x=df['index'], y=df['data'], c=df['color'], style=df['marker'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-13
    • 2022-01-21
    • 1970-01-01
    • 2017-12-13
    • 2020-08-22
    • 2020-02-25
    • 2014-09-16
    相关资源
    最近更新 更多