2016-11-19 37 views
1

我正在做一个散点图,其中标记的大小是由一个列表给出,以便每个不同。有什么方法可以添加一个说'这个大小的圆与此值相等'的键等等?就像地图有如何显示如何说1英寸等于1英里。 如果它非常重要,我在jupyter笔记本上这样做,但我认为这不重要。Pyplot传说/关键,但规模,就像在地图上

编辑:为了澄清,每个数据点是许多其他数据的平均值,每个标记的大小对应于计算该平均数的数据点数。举例来说,其中一个较小的点是50个数的中值,而其中一个较大的标记是数据点的中值为150个数。所以它们对应的数字也不是物理尺寸,就像地图一样。

我已经有了像我希望它们那样缩放的标记,我想要的是一个图例/键,它指示了标记大小与它来自的值之间的关系。

+0

问题不是很清楚。如果标记的大小代表一些值,例如* 10像素制造商是1英寸,12像素制造商是2英寸*或者标记大小实际上是否与轴相关联,例如1英寸标记的长度是1英寸?后者是在拓扑图中遇到的问题,但是阅读您的问题我不确定这是否意味着什么。你能说出轴上的数量,以及如果你想在不同的尺度上绘图(放大绘图等)? – ImportanceOfBeingErnest

回答

0

plt.scatter中使用自变量s(以点数^ 2为单位)。这是一个MWE。

import matplotlib.pyplot as plt 

value_and_markersize = {value:4**value for value in range(1, 10)} 

x = [2, 4, 5, 7] 
y = [0]*len(x) 
s = [value_and_markersize[value] for value in x] 

plt.scatter(x, y, s=s) 
plt.show() 

产生,

enter image description here

+0

这不是提问者的要求。相反,该问题要求提供与绘图数据值相关的标记。但是,'markersize'是以点为单位的,所以它不能给出与数据的关系。 – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest,thx为您的更正。我刚刚更新了我的答案。 – SparkAndShine

+1

仍不确定这是否是要求的。标记大小仍然是像素,而不是数据单位。如果您缩放绘图,缩放更改,但标记大小保持不变。 – ImportanceOfBeingErnest

1

据我了解,你希望你的标记是成比例的。这是plt.scatter()不可能的,因为它的标记总是以像素为单位。一个选项是使用补丁并将它们添加到PatchCollection中。

下面是一个例子

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.patches as mpatches 
from matplotlib.collections import PatchCollection 

patches = [] 
coordinates = [(0,0), (2,0), (5,2), (1,7.6), (6,7), (2,4), (-1,5)] 
sizes = 0.9+np.random.rand(len(coordinates),2)*1.99 
print sizes 

for i, co in enumerate(coordinates): 
    rect = mpatches.Rectangle(co, sizes[i,0], sizes[i,1], ec="k") 
    patches.append(rect) 

fig, ax = plt.subplots(figsize=(6,5)) 
ax.set_aspect("equal") 
colors = np.linspace(0, 1, len(patches)) 
collection = PatchCollection(patches, cmap=plt.cm.hsv, alpha=0.3) 
collection.set_array(np.array(colors)) 
ax.add_collection(collection) 

norm_scale = mpatches.Rectangle((7,-1), 2,2, ec="k", facecolor="b") 
ax.add_patch(norm_scale) 
ax.set_xlim([-2,10]) 
ax.set_ylim([-2,10]) 
ax.set_ylabel("position [meters]") 
ax.set_xlabel("position [meters]") 
ax.set_title("Tents on a meddow") 
ax.text(8,0.9, "2 m", color="w", ha="center", va="top") 
ax.text(7.1,0, "2 m", color="w", ha="left", va="center", rotation=90) 
plt.show() 

给下面的情节,其中深蓝色补丁是一种显示一个标准尺寸的关键。

enter image description here