首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >matplotlib散点图有没有一个‘level’等价的参数?

matplotlib散点图有没有一个‘level’等价的参数?
EN

Stack Overflow用户
提问于 2021-04-19 23:40:21
回答 2查看 84关注 0票数 2

我希望将观察值(散点图)绘制在模型输出(填充的等高线)之上。为了在等高线图中高亮显示感兴趣的区域,我使用levels参数指定了色阶中断。然而,当我在顶部绘制散点时,色标是不同的。有没有一种方法可以使散射色标与轮廓色标对齐?

在下面的示例中,我希望点颜色与背景颜色相匹配:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0,10).tolist()
y = np.arange(0,10).tolist()
z = np.ndarray((len(x),len(y)))

for i in range(0,10):
    for j in range(0,10):
        z[i][j] = x[i]*7+y[j]*3

im = plt.contourf(z, levels=[0,10,20,30,800,900,1000], cmap='rainbow')
cbar = plt.colorbar(im)
plt.scatter(np.meshgrid(x,y)[0], np.meshgrid(x,y)[1], 
            c=z, cmap='rainbow', edgecolor='k', s=100)

输出:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-20 01:07:56

Matplotlib的contourf似乎有一种非常特殊的方式来决定它的颜色分配(可能可以追溯到BoundaryNorm和相关函数之前)。

然而,可以利用从contourf结果的信息中提取的ListedColormapBoundaryNorm来复制该行为。

下面是一个稍微修改过的例子:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import BoundaryNorm, ListedColormap

x = np.arange(0, 10)
y = np.arange(0, 10)
z = x.reshape(1, -1) * 70 + y.reshape(-1, 1) * 30
z[:, 5] = 1000

levels = [0, 10, 20, 30, 800, 900, 1000]
im = plt.contourf(x, y, z, levels=levels, cmap='rainbow')
cbar1 = plt.colorbar(im, pad=0.05)
cbar1.ax.set_title('contourf')

cmap = ListedColormap(im.get_cmap()(im.norm(im.cvalues)))
norm = BoundaryNorm(levels, len(levels) - 1)
sc = plt.scatter(np.meshgrid(x, y)[0], np.meshgrid(x, y)[1],
                 c=z.ravel(), cmap=cmap, norm=norm, edgecolor='k', s=100)
cbar2 = plt.colorbar(sc, pad=0.1)
cbar2.ax.set_title('scatter')

plt.show()

票数 2
EN

Stack Overflow用户

发布于 2021-04-20 01:41:19

下面是我的代码:

代码语言:javascript
复制
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Apr 19 18:16:06 2021

@author: Pietro


https://stackoverflow.com/questions/67165115/is-there-a-levels-equivalent-argument-for-matplotlib-scatter-plot

"""




import numpy as np


import matplotlib.pyplot as plt

from matplotlib.pyplot import contourf

x = np.arange(0,10).tolist()
y = np.arange(0,10).tolist()
z = np.ndarray((len(x),len(y)))

for i in range(0,10):
    for j in range(0,10):
        z[i][j] = x[i]*7+y[j]*3
        
        
fig = plt.figure()
# im = contourf(z, levels=[0,10,20,30,800,900,1000], cmap='rainbow')

im = contourf(z, levels=[0,10,20,40,60,80,100], cmap='rainbow')

# for i in im:
#     print(i) #TypeError: 'QuadContourSet' object is not iterable
    
cbar = plt.colorbar(im)

zz = []

for i in range(z.shape[0]):
    for ii in range(z.shape[1]):
        print(z[i,ii])
        zz.append(int(z[i,ii]))
print(zz)


# im = contourf(z, levels=zz, cmap='rainbow')
# cbar = plt.colorbar(im)

ax = fig.add_subplot(111)


x1,y1 = np.meshgrid(x,y)[0], np.meshgrid(x,y)[1]

# ax.scatter(x1,y1, c=z, cmap='rainbow', edgecolor='k', s=100)

ax.scatter(x1,y1, c=z, cmap='rainbow', edgecolor='k', s=100)

plt.show()

输出:

我猜我调整了关卡到点,也就是背景是相同的点

相反,让我知道你的想法,而不是反之亦然。

我正在回答的代码已经被编辑过了,不确定

编辑后的问题的z值与原帖子相同

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

https://stackoverflow.com/questions/67165115

复制
相关文章

相似问题

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