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

发布于 2021-04-20 01:07:56
Matplotlib的contourf似乎有一种非常特殊的方式来决定它的颜色分配(可能可以追溯到BoundaryNorm和相关函数之前)。
然而,可以利用从contourf结果的信息中提取的ListedColormap和BoundaryNorm来复制该行为。
下面是一个稍微修改过的例子:
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()

发布于 2021-04-20 01:41:19
下面是我的代码:
#!/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值与原帖子相同
https://stackoverflow.com/questions/67165115
复制相似问题