python - legend() 没有正确显示数据集
问题描述
我试图在图例中显示 2 个主要数据集,即“Type2”(红色方块)和“Type1”(蓝色圆圈)。尽管如此,由于我的情节涉及“Type1”和“Type2”的子组(A,B 是每个子组),因此图例中出现了 4 个项目。请看看我的情节如何:
问题是 legend() 倾向于显示 4 个项目:红色正方形、红色正方形、蓝色圆圈、蓝色 cricle,而我只需要其中两个,即红色正方形代表 Type2,蓝色圆圈代表 Type1。
Type2 Mean2 SD2
A 4.1 1.9
A 5.7 0.9
A 7.5 1.2
B 6.9 0.7
B 4.9 0.4
B 8.5 1
Type1 Mean1 SD1
A 8.1 1
A 7.7 0.9
A 8.5 1.1
B 5.9 0.4
B 7.9 0.7
B 9.5 1.2
Figure1 = plt.figure('Scatter Plot', figsize=(6,6), dpi=300)
Subplot1 = Figure1.add_subplot(1,1,1)
markers = ['s','s']
colors = ['r', 'r']
grouped = DataFrame.groupby('Type2')
for i,((g,d),m,c) in enumerate(zip(grouped,markers,colors)):
x = np.random.normal(loc=i,scale=0.2,size=(len(d['Mean2'],)))
Subplot1.errorbar(x, y= Mean2 , yerr= SD2 ,
fmt=m,
markersize=5, color=c,
capsize=3, markeredgewidth=0.5
)
XPos = list(range(len(grouped)))
Subplot1.set_xticks(XPos)
Subplot1.set_xticklabels([a for a in grouped.groups])
Subplot1.set_xlim(-0.5,1.5)
###############################################
###############################################
markers = ['o','o']
colors = ['b', 'b']
grouped = DataFrame.groupby('Type1')
for i,((g,d),m,c) in enumerate(zip(grouped,markers,colors)):
x = np.random.normal(loc=i,scale=0.2,size=(len(d['Mean1'],)))
Subplot1.errorbar(x, y= Mean1, yerr= SD1,
fmt=m,
markersize=5, color=c,
capsize=3, markeredgewidth=0.5
)
###############################################
###############################################
Subplot1.legend(['Type2','not needed!', 'Type1','not needed!'])
任何意见将不胜感激。非常感谢!
解决方案
Matplotlib 只会将项目添加到label
附有 的图例中。您可以对 的标签分配使用三元运算,errorbar
只为每个 groubby 对象的第一次迭代提供标签。
例子:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df1 = pd.DataFrame({'Type1': ['A', 'A', 'A', 'B', 'B', 'B'],
'y_mean1': [8.1, 7.7, 8.5, 5.9, 7.9, 9.5],
'y_SD1': [1.0, 0.9, 1.1, 0.4, 0.7, 1.2]})
df2 = pd.DataFrame({'Type2': ['A', 'A', 'A', 'B', 'B', 'B'],
'y_mean2': [4.1, 5.7, 7.5, 6.9, 4.9, 8.5],
'y_SD2': [1.9, 0.9, 1.2, 0.7, 0.4, 1.0]})
df1['x'] = np.random.rand(6)
df2['x'] = np.random.rand(6)
fix, ax = plt.subplots(1,1)
for i, (glab, g) in enumerate(df1.groupby('Type1')):
h1 = ax.errorbar(g.x,
g.y_mean1,
g.y_SD1,
fmt='o',
c='b',
capsize=3,
markeredgewidth=0.4,
elinewidth=0.4,
# label is only assigned on the first iteration
label='Type1' if not i else None)
for i, (glab, g) in enumerate(df2.groupby('Type2')):
h2 = ax.errorbar(g.x,
g.y_mean2,
g.y_SD2,
fmt='s',
c='r',
capsize=3,
markeredgewidth=0.4,
elinewidth=0.4,
# label is only assigned on the first iteration
label='Type2' if not i else None)
ax.legend()
推荐阅读
- r - 学习如何在 R 中的函数中处理 ...
- python-3.x - Django - 在模板呈现具有动态字段的脆表单时出错:“int”对象没有属性“get”
- reactjs - 从数据库中获取数据到路由器后,从后端到前端获取数据
- sql - DB2:搜索深度优先:(语法)错误
- java - 如何扩展 Spring oidcUser 以使用 customUserDetails
- amazon-web-services - 如何在 AWS 胶水中使用从一个胶水脚本到另一个胶水脚本的函数
- java - 如何在signe测试用例中为不同的url多次模拟res模板
- version-control - 从 helix 服务器中删除文件和文件夹,同时将它们保留在 pc 上
- theano - RuntimeError: 无法加载 cudnn 库。检查您的 cudnn 安装。也许使用 Theano 标志 dnn.base_path 可以帮助你
- android - 这个错误是什么意思(Tasker Android App(Plugin:AutoInput))