我有一个matplotlib
分散图,如下所示。
import matplotlib.pyplot as plt
from pylab import plot,axis,show,pcolor,colorbar,bone
axiss = [(0, 0), (0, 1), (0, 0), (2, 2), (0, 2), (2, 2), (2, 0), (0, 2), (1, 2), (2, 0)]
x,y = zip(*axiss)
labels = ['u1', 'u2', 'u3', 'u4',
'u5', 'u6', 'u7', 'u8',
'u9', 'u10']
fig, ax = plt.subplots()
ax.scatter(x, y)
for i, txt in enumerate(labels):
ax.annotate(txt, (x[i],y[i]))
show()
我想要显示一个点上分散了多少数据点,而不是标签。例如,在我用红色标记的数据点中,它应该显示' 2'。在鼠标悬停事件中,我需要看到标签。所以在这个例子中它应该是' u7'和' u10'。可以使用matplotlib
吗?
答案 0 :(得分:2)
它有点长,但我会首先使用axiss
收集set
中的唯一元素,并计算每个唯一元素的数量。然后将该数据包含在scatter
的第三个参数中,即点的大小。我还会根据该点的数据集数量来注释每个点。
现在,交互式注释是一个棘手的部分。我找不到鼠标悬停事件捕手,但你可以做鼠标点击事件几乎相同的事情。将此页面上的第一个脚本http://wiki.scipy.org/Cookbook/Matplotlib/Interactive_Plotting保存为interactive_annotations.py
,然后将其导入脚本。
import matplotlib.pyplot as plt
from pylab import plot,axis,show,pcolor,colorbar,bone
import numpy as np
axiss = [(0, 0), (0, 1), (0, 0), (2, 2), (0, 2), (2, 2), (2, 0), (0, 2), (1, 2), (2, 0)]
# get unique elements
axiss_unique = list(set(axiss))
# get number of data at each datapoint
axiss_count = [axiss.count(x) for x in axiss_unique]
sc = 100 # scale up the datapoints for scatter
labels = [] # label each point according to number of data there
annotates = [] # intereactively label each point according to the datapoint name
for i in range(len(axiss_count)):
labels.append('%i'%axiss_count[i])
annotates.append( ' '.join(['u'+str(k) for k, j in enumerate(axiss) if j == axiss_unique[i]]))
axiss_count[i] *= sc
x,y = zip(*axiss_unique)
fig, ax = plt.subplots()
# get offsets of the labels to each point
x_os, y_os = max(x)/20., max(y)/20.
ax.scatter(x, y, axiss_count)
for i, txt in enumerate(labels):
ax.annotate(txt, (x[i]+x_os,y[i]+y_os), fontsize=15)
# interactive annotation
import interactive_annotations
af = interactive_annotations.AnnoteFinder(x,y, annotates)
connect('button_press_event', af)
show()
结果是这样的。
您可以编辑interactive_annotations.py
以更改注释,字体等的偏移量。