首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python 3中使用matplotlib散射函数时如何更改点子集的绘图标记

在python 3中使用matplotlib散射函数时如何更改点子集的绘图标记
EN

Stack Overflow用户
提问于 2019-10-01 19:09:39
回答 2查看 740关注 0票数 1

我有许多自定义的2d点对象,每个对象具有:

  • 坐标x和y
  • 标签1°( -1和+inf之间的整数):这将用标记的颜色(cmap索引)
  • 标签2°(1范围内的整数)来表示:我希望用标记类型

来表示这个标记。

问题是,许多点将共享一个标号1°值,但在标号2°1中可能有所不同,反之亦然。

我试着提取与标号2°的值有关的点,并分别绘制它们,方法是:

代码语言:javascript
复制
pointsSubset1 = getPointsWithLabel2Value1()
pointsSubset2 = getPointsWithLabel2Value2()
pointsSubset3 = getPointsWithLabel2Value3()

# just assume x y and labels values are obtained correctly

plt.scatter(x1, y1, c=listOfLabels1ForSubset1, cmap="nipy_spectral", marker='s') # plotting pointsSubset1

plt.scatter(x2, y2, c=listOfLabels1ForSubset2, cmap="nipy_spectral", marker='.') # plotting pointsSubset2

plt.scatter(x3, y3, c=listOfLabels1ForSubset3, cmap="nipy_spectral", marker='<') # plotting pointsSubset3

我以为这会有用,但它不能。标记是正确的,但颜色不是.

忽略x和y坐标的示例:

  • subset1 =

代码语言:javascript
复制
- point1:   
    - label1: -1
    - label2: 1

  • subset2 =

代码语言:javascript
复制
- point2:   
    - label1: 1
    - label2: 2

在这种情况下,来自subset1的subset1将有一个不同于来自subset2的point2的标记,但是两者都将共享相同的颜色(黑色),因为当两者分开绘制时,尽管它们有不同的label1值,它们都将被映射到光谱中的第一个颜色.

我希望cmap中的颜色索引在点子集之间匹配,并且我不认为传递自定义颜色数组是解决办法bc标签1可能的值在-1, +inf范围内。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-01 20:37:27

我想会到达你想要的地方

代码语言:javascript
复制
Npoints = 50
x,y = np.random.random(size=(2,Npoints))
label1 = np.random.choice([-1,1,2,3], size=(Npoints,))
label2 = np.random.choice([1,2,3],size=(Npoints,))

label1_min = min(label1)
label1_max = max(label1)
marker_dict = {1:'s',2:'o',3:'<'}

fig, ax = plt.subplots()
for i,m in marker_dict.items():
    ax.scatter(x[label2==i], y[label2==i], marker=m, c=label1[label2==i], cmap='nipy_spectral', vmin=label1_min, vmax=label1_max)

票数 1
EN

Stack Overflow用户

发布于 2019-10-01 20:34:55

简易方式:

我将分享我的发现,以防有人在同一个问题上挣扎。结果是,您可以调用plt.scatter()一次,并为标记提供一个自定义大小数组。这样,您就可以根据给定的标准“播放”更改标记大小(在我的例子中是标签2值),在绘图时能够看到点数子集之间的差异。

会是这样的:

代码语言:javascript
复制
s = getMarkerCustomSizeForEachPoint()
# x is a list of every x coordinate
# y is a list of every y coordinate
# clusters is a list of every point label (label 1 value in my case)
# marker='s' -> squares
plt.scatter(x, y, c=clusters, cmap="nipy_spectral", marker='s', alpha=0.8, s=s)

将标记大小设置为一个非常小的数字,就像有点一样,所以您可以使用方格和“点”,而只指定标记=‘s’:)

请记住,当构建不同的列表时,匹配的索引表示相同的点(在x、y、群集和s中)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58190892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档