Matplotlib在散点图中标记数据点
参考:label points on scatter plot matplotlib
在数据可视化中,散点图是一种常用的图表类型,用于展示两个变量之间的关系。有时候我们需要在散点图中标记一些特殊的数据点,以便更清晰地展示数据。在Matplotlib中,我们可以使用annotate()函数来实现这一功能。
在散点图中标记单个数据点
首先,我们来看一下如何在散点图中标记单个数据点。下面是一个简单的示例代码:
import matplotlib.pyplot as plt
# 创建数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
plt.scatter(x, y)
# 标记数据点(3, 5)
plt.annotate('how2matplotlib.com', (3, 5))
plt.show()
Output:
在这个示例中,我们先创建了一组数据点的x和y坐标,然后使用scatter()函数绘制了散点图。接着,我们使用annotate()函数在散点图中标记了坐标为(3, 5)的数据点。
在散点图中标记多个数据点
如果我们需要标记多个数据点,可以在循环中使用annotate()函数。下面是一个示例代码:
import matplotlib.pyplot as plt
# 创建数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
labels = ['A', 'B', 'C', 'D', 'E']
plt.scatter(x, y)
# 标记数据点
for i, label in enumerate(labels):
plt.annotate(label, (x[i], y[i]))
plt.show()
Output:
在这个示例中,我们使用了一个名为labels的列表来存储要标记的数据点的标签,然后在循环中依次标记每个数据点。
在散点图中标记不同类型的数据点
有时候我们希望标记不同类型的数据点,例如使用不同的颜色或形状。我们可以在annotate()函数中设置不同的参数来实现这一功能。下面是一个示例代码:
import matplotlib.pyplot as plt
# 创建数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
labels = ['A', 'B', 'C', 'D', 'E']
colors = ['r', 'g', 'b', 'y', 'm']
markers = ['o', 's', '^', 'D', 'v']
plt.scatter(x, y)
# 标记数据点
for i, label in enumerate(labels):
plt.annotate(label, (x[i], y[i]), color=colors[i], marker=markers[i])
plt.show()
在这个示例中,我们使用了两个额外的列表colors和markers来分别存储要使用的颜色和形状。然后在循环中根据每个数据点的索引i来选择对应的颜色和形状。
在散点图中添加带箭头的标注
除了在数据点旁边标记文字外,我们还可以在散点图中添加带箭头的标注。下面是一个示例代码:
import matplotlib.pyplot as plt
# 创建数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
plt.scatter(x, y)
# 添加标注带箭头
plt.annotate('how2matplotlib.com', (3, 5), xytext=(4, 6),
arrowprops=dict(arrowstyle='->'))
plt.show()
Output:
在这个示例中,我们使用了annotate()函数的另外一个参数xytext来设置标注的文本位置,然后使用arrowprops参数来设置箭头的样式。
在散点图中添加注释框
有时候我们希望在标注数据点时显示更多的信息,可以使用注释框来展示。下面是一个示例代码:
import matplotlib.pyplot as plt
# 创建数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
plt.scatter(x, y)
# 添加注释框
plt.annotate('how2matplotlib.com', (3, 5), xy=(3, 5),
bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=0.3))
plt.show()
在这个示例中,我们使用了bbox参数来设置注释框的样式,包括边框形状、填充颜色和透明度等。
在散点图中添加文本标注
除了标记数据点外,我们还可以在散点图中添加文本标注。下面是一个示例代码:
import matplotlib.pyplot as plt
# 创建数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
plt.scatter(x, y)
# 添加文本标注
plt.text(3, 5, 'how2matplotlib.com', fontsize=12, color='red')
plt.show()
Output:
在这个示例中,我们使用了text()函数在散点图中添加了一个文本标注,可以设置文本的内容、字体大小和颜色等。
在散点图中添加箭头标注
除了使用标注文本外,我们还可以在散点图中添加箭头标注。下面是一个示例代码:
import matplotlib.pyplot as plt
# 创建数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
plt.scatter(x, y)
# 添加箭头标注
plt.arrow(1, 2, 1, 1, head_width=0.3, head_length=0.3, fc='g', ec='b')
plt.show()
Output:
在这个示例中,我们使用了arrow()函数在散点图中添加了一个箭头标注,可以设置箭头的起点、方向、头部宽度和长度、填充颜色和边框颜色等。
在散点图中添加注释
除了标注数据点外,我们还可以添加一般性的注释来说明图中的一些信息。下面是一个示例代码:
import matplotlib.pyplot as plt
# 创建数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
plt.scatter(x, y)
# 添加注释
plt.annotate('how2matplotlib.com', xy=(3, 5), xytext=(4, 6),
arrowprops=dict(facecolor='black', shrink=0.05))
plt.show()
Output:
在这个示例中,我们使用annotate()函数添加了一个一般性的注释,包括文本内容、注释位置、文本位置和箭头样式等。
在散点图中添加带有HTML标签的标注
有时候我们希望在标注文本中使用HTML标签,可以通过设置annotate()函数的参数来实现。下面是一个示例代码:
import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
# 创建数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
plt.scatter(x, y)
# 添加带有HTML标签的标注
img_path = 'how2matplotlib.com/matplotlib-logo.png'
img = plt.imread(img_path)
imagebox = OffsetImage(img, zoom=0.1)
ab = AnnotationBbox(imagebox, (3, 5))
plt.gca().add_artist(ab)
plt.show()
在这个示例中,我们使用OffsetImage类和AnnotationBbox类来添加带有HTML标签的标注,其中img_path为要显示的图片路径,通过设置zoom参数来调整图片的大小。
在散点图中添加动态标注
有时候我们希望在散点图中添加动态的标注,例如鼠标悬停在数据点上时显示标注。可以使用FuncAnimation类来实现这一功能。下面是一个示例代码:
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
# 创建数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
labels = ['A', 'B', 'C', 'D', 'E']
fig, ax = plt.subplots()
sc = ax.scatter(x, y)
annot = ax.annotate("", xy=(0, 0), xytext=(20, 20), textcoords="offset points",
bbox=dict(boxstyle="round", fc="w"),
arrowprops=dict(arrowstyle="->"))
def update_annot(ind):
pos = sc.get_offsets()[ind["ind"][0]]
annot.xy = pos
text = "{}".format(" ".join(str(labels[n]) for n in ind["ind"]))
annot.set_text(text)
def hover(event):
vis = annot.get_visible()
if event.inaxes == ax:
cont, ind = sc.contains(event)
if cont:
update_annot(ind)
annot.set_visible(True)
fig.canvas.draw_idle()
else:
if vis:
annot.set_visible(False)
fig.canvas.draw_idle()
fig.canvas.mpl_connect("motion_notify_event", hover)
plt.show()
Output:
在这个示例中,我们使用FuncAnimation类创建了一个动态标注,当鼠标悬停在数据点上时,会显示对应的标注信息。
通过以上示例,我们学习了如何在Matplotlib中标记散点图中的数据点,包括标记单个数据点、多个数据点、不同类型的数据点、带箭头的标注、注释框、文本标注、箭头标注、一般性的注释、带有HTML标签的标注以及动态标注等。这些技巧可以帮助我们更好地展示数据,提升数据可视化的效果和表现力。