在matplotlib中绘制数据点的数量

时间:2014-03-20 04:40:10

标签: python matplotlib plot

我有一个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吗?

enter image description here

1 个答案:

答案 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()

结果是这样的。 enter image description here

您可以编辑interactive_annotations.py以更改注释,字体等的偏移量。