绘制散点图后如何修改其颜色图

时间:2018-12-19 09:55:43

标签: python-3.x matplotlib

例如,您可以使用scatter(X, Y, c=..., cmap="rainbow")将颜色图分配给散布图,但是以后是否可以修改颜色图?

我知道我们可以通过set_color()set_alpha()来更改透明度和颜色,但是我没有找到等效的颜色图。一种解决方法是保存分散的数据,将其擦除,然后使用新参数再次scatter(),但这将非常昂贵。这是一个问题,因为此问题的目标是能够实时更改c参数,以便将旧点“冷却”为深色。

感谢您的时间。


编辑以添加更多信息:我希望能够在单一颜色的散点图和可变色图和规范化的散点图之间来回切换。例如,在scatter(X, Y, color="#FF0000")scatter(X, Y, c=age, cmap="rainbow")之间,带有变量age = [i for i,x in enumerate(X)]

2 个答案:

答案 0 :(得分:1)

@ImportanceOfBeingErnest指出,使用set_cmap()似乎很简单:

x = np.linspace(0,10,10)
y = x**2
c = np.linspace(-10,10,10)
cmap = "seismic"
norm = matplotlib.colors.Normalize(vmin=min(c),vmax=max(c))



from matplotlib.widgets import RadioButtons

fig, ax = plt.subplots()

scat = plt.scatter(x,y,c=c,cmap=cmap,norm=norm)
plt.colorbar()
scat.update_scalarmappable()
scat.set_facecolors('k')

plt.subplots_adjust(left=0.3)

axcolor = 'lightgoldenrodyellow'
rax = plt.axes([0.05, 0.7, 0.15, 0.15], facecolor=axcolor)
radio = RadioButtons(rax, ('no-cmap','cmap'))

def colorfunc(label):
    if label=="cmap":
        scat.set_cmap(cmap)
        scat.set_norm(norm)
    elif label=="no-cmap":
        scat.set_facecolors('k')
    else:
        raise KeyError("invalid label")
    plt.draw()
radio.on_clicked(colorfunc)

enter image description here

答案 1 :(得分:1)

您实际上可以更改值,而不是更改颜色图。如果您为色图设置了under颜色,则可以将值更改为标准以下的任何值,并使它以该颜色显示。

当按下 n 时,以下将设置为小于最小值的一。按 m 时,它们会恢复为原始值。

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(42)

a = np.random.randint(10,30, size=20)
x = np.random.rand(20)
y = np.random.rand(20)

cmap = plt.get_cmap("rainbow")
cmap.set_under("black")

fig, ax = plt.subplots()
ax.set_title("Press n and m keys to change colors")
sc = ax.scatter(x,y, c=a, cmap=cmap)

def change(evt):
    if evt.key in list("nm"):
        if evt.key == "n":
            sc.set_array(np.ones_like(a)*a.min()-1)
        if evt.key == "m":
            sc.set_array(a)
        fig.canvas.draw_idle()


fig.canvas.mpl_connect("key_press_event", change)

plt.show()

如果您确实需要从未定义其数组的散点开始,则可以如下所示进行操作。

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(42)

a = np.random.randint(10,30, size=20)
x = np.random.rand(20)
y = np.random.rand(20)

cmap = plt.get_cmap("rainbow")
cmap.set_under("black")
norm = plt.Normalize(a.min(), a.max())

fig, ax = plt.subplots()
ax.set_title("Press n and m keys to change colors")
sc = ax.scatter(x,y, color="black")

def change(evt):
    if evt.key in list("nm"):
        sc.set_cmap(cmap)
        sc.set_norm(norm)
        if evt.key == "n":
            sc.set_array(np.ones_like(a)*a.min()-1)
        if evt.key == "m":
            sc.set_array(a)
        fig.canvas.draw_idle()
        

fig.canvas.mpl_connect("key_press_event", change)

plt.show()