更改颜色条限制而不更改它在散点图中表示的数据值

问题描述 投票:0回答:2

我正在尝试更改附加到散点图的颜色条,以便颜色条的最小值和最大值是数据的最小值和最大值,但我希望数据以零为中心,因为我正在使用颜色图白色为零。这是我的例子

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 1, 61)
y = np.linspace(0, 1, 61)
C = np.linspace(-10, 50, 61)
M = np.abs(C).max() # used for vmin and vmax

fig, ax = plt.subplots(1, 1, figsize=(5,3), dpi=150)
sc=ax.scatter(x, y, c=C, marker='o', edgecolor='k', vmin=-M, vmax=M, cmap=plt.cm.RdBu_r)
cbar=fig.colorbar(sc, ax=ax, label='$R - R_0$ (mm)')
ax.set_xlabel('x')
ax.set_ylabel('y')

正如您从附图中看到的那样,颜色条下降到

-M
,我希望颜色条下降到-10,但是如果我让
vmin=-10
然后颜色条不会归零为白色.通常,在使用
vmin
时将
M
设置为 +/-
contourf
颜色栏会自动按我想要的方式排序。当
contourf
使用
levels=np.linspace(-M,M,61)
而不是使用
vmin
vmax
levels=62
时,这种行为是我所期望的。下面显示了我的
contourf
示例中我想要的默认
scatter
颜色条行为的示例

plt.figure(figsize=(6,5), dpi=150)
plt.contourf(x, x, np.reshape(np.linspace(-10, 50, 61*61), (61,61)),
                   levels=62, vmin=-M, vmax=M, cmap=plt.cm.RdBu_r)
plt.colorbar(label='$R - R_0$ (mm)')

有人有什么想法吗?我找到了这个链接,我认为这可能会解决问题,但是当执行

cbar.outline.set_ydata
行时,我得到了这个错误
AttributeError: 'Polygon' object has no attribute 'set_ydata' 
.

编辑有点恼火,因为有人关闭了这个问题,却不允许我澄清他们可能有的任何问题,因为提出的解决方案都不是我要的。 至于

Normalize.TwoSlopeNorm
,我不想重新调整较小的负边以使用整个颜色图范围,我只希望连接到我的图表一侧的颜色条停在
-10
这个链接也没有解决我的问题,因为它又是
TwoSlopeNorm
解决方案。

python matplotlib scatter-plot colorbar
2个回答
4
投票

改变colorbar的ylim后,周围的spine组成的矩形太大了。您可以使该轮廓不可见。然后添加一个新的矩形边框:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 1, 61)
y = np.linspace(0, 1, 61)
C = np.linspace(-10, 50, 61)
M = np.abs(C).max()  # used for vmin and vmax

fig, ax = plt.subplots(1, 1, figsize=(5, 3), dpi=150)
sc = ax.scatter(x, y, c=C, marker='o', edgecolor='k', vmin=-M, vmax=M, cmap=plt.cm.RdBu_r)
cbar = fig.colorbar(sc, ax=ax, label='$R - R_0$ (mm)')

cb_ymin = C.min()
cb_ymax = C.max()
cb_xmin, cb_xmax = cbar.ax.get_xlim()
cbar.ax.set_ylim(cb_ymin, cb_ymax)
cbar.outline.set_visible(False)  # hide the surrounding spines, which are too large after set_ylim
cbar.ax.add_patch(plt.Rectangle((cb_xmin, cb_ymin), cb_xmax - cb_xmin, cb_ymax - cb_ymin,
                                fc='none', ec='black', clip_on=False))
plt.show()


2
投票

v3.5 发布之前的另一种方法是制作一个自定义颜色图来执行您想要的操作(另请参见https://matplotlib.org/stable/tutorials/colors/colormap-manipulation.html#sphx-glr-tutorials-颜色-颜色图-操作-py)

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm
from matplotlib.colors import ListedColormap

fig, axs = plt.subplots(2, 1)

X = np.random.randn(32, 32) + 2
pc = axs[0].pcolormesh(X, vmin=-6, vmax=6, cmap='RdBu_r')
fig.colorbar(pc, ax=axs[0])

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm
from matplotlib.colors import ListedColormap

fig, axs = plt.subplots(2, 1)

X = np.random.randn(32, 32) + 2
pc = axs[0].pcolormesh(X, vmin=-6, vmax=6, cmap='RdBu_r')
fig.colorbar(pc, ax=axs[0])

def keep_center_colormap(vmin, vmax, center=0):
    vmin = vmin - center
    vmax = vmax - center
    dv = max(-vmin, vmax) * 2
    N = int(256 * dv / (vmax-vmin))
    RdBu_r = cm.get_cmap('RdBu_r', N)
    newcolors = RdBu_r(np.linspace(0, 1, N))
    beg = int((dv / 2 + vmin)*N / dv)
    end = N - int((dv / 2 - vmax)*N / dv)
    newmap = ListedColormap(newcolors[beg:end])
    return newmap

newmap = keep_center_colormap(-2, 6, center=0)
pc = axs[1].pcolormesh(X, vmin=-2, vmax=6, cmap=newmap)
fig.colorbar(pc, ax=axs[1])
plt.show()

© www.soinside.com 2019 - 2024. All rights reserved.