Hen*_*ung 3 python matplotlib dataframe pandas
我正在尝试通过分组绘制一些数据的散点图。它们按列分组,我希望它们根据组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()
Run Code Online (Sandbox Code Playgroud)
我希望这些组也有不同的标记样式。例如,红色条目将具有标记“o”(大点),绿色条目将具有标记“^”(向上三角形)等。
我想
plt.scatter(x=df["index"], y=df["data"], c=df["color"], marker=df["marker"])
Run Code Online (Sandbox Code Playgroud)
本来可以,但是不行……
TypeError: 'Series' objects are mutable, thus they cannot be hashed
Run Code Online (Sandbox Code Playgroud)
我可以for循环 DataFrame 并按条目对条目进行分组group。marker然后使用定义了列表的参数集绘制它们(例如plt.scatter(..., marker=markers[group])。这将导致 4 plt.scatter(...),因为总共有 4 个组。但在我看来,逐行循环遍历 DataFrame 是丑陋的,我坚信有更好的方法。
提前致谢!
在我看来,逐行循环数据帧是丑陋的,我坚信有更好的方法
对于 matplotlib,我认为没有比循环更好的方法了。请注意,如果您使用groupby标记,它不会逐行循环,而是逐组循环(在本例中为 4 次)。
这将调用plt.scatter4 次(每个标记一次):
for marker, d in df.groupby('marker'):
plt.scatter(x=d['index'], y=d['data'], c=d['color'], marker=marker, label=marker)
plt.legend()
Run Code Online (Sandbox Code Playgroud)
正如 r-beginners 评论的那样,sns.scatterplot通过以下方式支持多个标记style:
sns.scatterplot(x=df['index'], y=df['data'], c=df['color'], style=df['marker'])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7626 次 |
| 最近记录: |