我必须生成一系列散点图(总共大约100个)。
我已经创建了一个示例来说明问题。
首先进行导入。
import pandas as pd
创建一个pandas数据帧。
# Create dataframe
data = {'name': ['Jason', 'Jason', 'Tina', 'Tina', 'Tina', 'Jason', 'Tina'],
'report_value': [4, 24, 31, 2, 3, 5, 10],
'coverage_id': ['m1', 'm2', 'm3', 'm4', 'm5', 'm6', 'm7']}
df = pd.DataFrame(data)
print(df)
输出:
coverage_id name report_value
0 m1 Jason 4
1 m2 Jason 24
2 m3 Tina 31
3 m4 Tina 2
4 m5 Tina 3
5 m6 Jason 5
6 m7 Tina 10
目标是在不使用for循环的情况下生成两个散点图。该人名Jason或Tina应显示在标题中。 report_value应位于两个图中的y轴和x轴上的coverage_id(字符串)中。
我想我应该从:
开始df.groupby('name')
然后我需要将操作应用于每个组。
这样我就可以按名称对数据框进行分组。我不知道如何继续并让Python为我制作两个图。
非常感谢您的帮助。
答案 0 :(得分:0)
我认为您可以使用this solution,但首先需要将string
列转换为数字,plot
和最后设置xlabels
:
import matplotlib.pyplot as plt
u, i = np.unique(df.coverage_id, return_inverse=True)
df.coverage_id = i
groups = df.groupby('name')
# Plot
fig, ax = plt.subplots()
ax.margins(0.05) # Optional, just adds 5% padding to the autoscaling
for name, group in groups:
ax.plot(group.coverage_id,
group.report_value,
marker='o',
linestyle='',
ms=12,
label=name)
ax.set(xticks=range(len(i)), xticklabels=u)
ax.legend()
plt.show()
seaborn.pairplot
的另一个seaborn
解决方案:
import seaborn as sns
u, i = np.unique(df.coverage_id, return_inverse=True)
df.coverage_id = i
g=sns.pairplot(x_vars=["coverage_id"], y_vars=["report_value"], data=df, hue="name", size=5)
g.set(xticklabels=u, xlim=(0, None))