簡體   English   中英

將colorbar作為圖例添加到matplotlib scatterplot(多個子圖,多個散點圖)

[英]Add colorbar as legend to matplotlib scatterplot (multiple subplots, multiple scatters)

我有幾個子圖,我想添加一個顏色條。 每個子圖由7個散點組成。 我發現了如何添加色塊的建議,但它們主要與每個散點的值有關,而與行本身無關。

代表性示例代碼:

import numpy as np
from matplotlib import pyplot as plt

x = range(50)
scales = np.linspace(0, 2, 7)
locs = range(4)
cmap = plt.get_cmap("Spectral")
for s_plot in range(4):
    plt.subplot(2, 2, s_plot+1)
    color = iter(cmap(np.linspace(0, 1, len(scales))))
    for scale in scales:
        c = next(color)
        y = np.random.normal(loc=locs[s_plot], scale=scale, size=50)
        plt.scatter(x, y, c=c, s=5)
        plt.title("Mean = {:d}".format(locs[s_plot]))
plt.subplots_adjust(hspace=0.4)
plt.show()

上面的例子給出: 在此輸入圖像描述

我想要的顏色條看起來像這樣(假的,放在情節旁邊):

在此輸入圖像描述

因此,colorbar不會描繪散點圖的值,而是描繪迭代的不同“行”(在這種情況下:不同的比例)。 在有助於將點與比例匹配的示例中。

我試過的很簡單

plt.colorbar()

在完成每個子圖之后調用一次。 但我得到TypeError: You must first set_array for mappable另外,因為它是我想要創建顏色圖的不同尺度,我也嘗試過

plt.colorbar(scales) 

返回: AttributeError: 'numpy.ndarray' object has no attribute 'autoscale_None'

我目前缺乏如何繼續這方面的指導。 編輯:我被標記為matplotlib colorbar for scatter的可能副本。 我已經發現了這個問題,但它對我的問題沒有幫助。 在我的情況下,我需要一個獨立於z值的colormap,但只會指示“行號”或“散點行”,或者你想要調用它(相當於plt.plot “lines”) )。

colorbar需要ScalarMappable作為輸入。 因此,如果您在繪圖中創建的任何內容都不適合,那么您可以自己創建它。

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.cm import ScalarMappable

x = range(50)
scales = np.linspace(0, 2, 7)
locs = range(4)
cmap = plt.get_cmap("Spectral")
norm = plt.Normalize(scales.min(), scales.max())

fig, axes = plt.subplots(2,2, constrained_layout=True, sharey=True)

for s_plot, ax in enumerate(axes.flat):
    for scale in scales:
        y = np.random.normal(loc=locs[s_plot], scale=scale, size=50)
        sc = ax.scatter(x, y, c=[cmap(norm(scale))], s=5)
        ax.set_title("Mean = {:d}".format(locs[s_plot]))

sm =  ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([])
cbar = fig.colorbar(sm, ax=axes[:,1])
cbar.ax.set_title("scale")

plt.show()

在此輸入圖像描述

如果我理解正確,那么你有一些范圍,並希望為此繪制一個色彩圖(沒有一些情節實際上使用色彩圖)。 基本上,您可以使用任何軸繪制顏色圖

import matplotlib
norm = matplotlib.colors.Normalize(vmin=0, vmax=50)

ax = plt.gca()
matplotlib.colorbar.ColorbarBase(ax, cmap='viridis', norm=norm)

當然,您可以使用任何軸(或使用inset_axes將軸放置在特定的位置)。

更棘手的是獲得與首先匹配色彩圖的散點圖的顏色。 我不確定是否有更簡單的方法,但我將顏色轉換為RGB以進行繪圖。 這是一個完整的例子:

import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
import numpy as np

N = 10

# dummy data
x_ = [k/10*np.arange(10) for k in range(N)]

cmap = matplotlib.cm.get_cmap('viridis')
cmap_values = np.linspace(0., 1., N)
colors = cmap(cmap_values)

colors_rgb = ['#{0:02x}{1:02x}{2:02x}'.format(int(255*a), int(255*b), int(255*c)) for a, b, c, _ in colors]

plt.figure()

for x, c in zip(x_, colors_rgb):
    plt.plot(x, c=c)

norm = matplotlib.colors.Normalize(vmin=0, vmax=50)
ticks = np.arange(0, 60, 10)

# vertical colorbar
cbaxes = inset_axes(plt.gca(), width="3%", height="80%", loc=2)
cbar = matplotlib.colorbar.ColorbarBase(cbaxes, cmap=cmap, norm=norm, ticks=ticks)
cbar.set_label('scale')
cbar.ax.set_yticklabels(ticks, fontsize=12)

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM