簡體   English   中英

顯示matplotlib顏色條而不是多個繪圖的圖例,顏色逐漸變化

[英]show matplotlib colorbar instead of legend for multiple plots with gradually changing colors

我試圖制作一個簡單的圖表,顯示許多屬於具有特定順序的大型數據集的曲線,假設情節1..n。 隨着n的增加,曲線的形狀逐漸變化。 讀者可以准確地看到哪個圖屬於n的哪個值並不重要,但是他們應該能夠猜測n的數量級。

因此,我做這樣的事情:

nValues = range(0,30)
xValues = np.linspace(0,10)
dataset = [(xValues-5-0.5*n)**2 for n in nValues]
colors = {n: colorsys.hsv_to_rgb(hue,0.9,0.7) for n,hue in zip(nValues,np.linspace(0,0.7,len(nValues)))}
for n in nValues:
    plt.plot(dataset[n],color=colors[n])

(為了清楚起見,這僅僅是為了示例,我的數據實際上存儲在一個漂亮的pandas數據幀中。)

在此輸入圖像描述

而不是圖例,我想在圖表旁邊添加一個顏色條,可能有幾個標記和標簽(至少是最小值和最大值),以指示哪個顏色屬於n的哪個值,但我不是知道如何做到這一點。 如果我真的從ColorMap獲得我的繪圖顏色,我認為事情可能會更容易,但我也不知道如何做到這一點,我也不知道如何從那里開始。

歡迎任何指示!

@tom和@Joe Kington都是對的:之前有人問過。 但是,我嘗試以相關答案的輕微努力為例。 要使用色彩映射(始終將值從[0,1]映射到顏色),首先需要規范化數據。 為此,您可以使用Normalize類。 只有在您打算創建ScalarMappable時才需要ScalarMappable實例。

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import matplotlib.cm as cm
import numpy as np

# your dataset
nValues = np.arange(0,30)
xValues = np.linspace(0,10)
dataset = [(xValues-5-0.5*n)**2 for n in nValues]

# setup the normalization and the colormap
normalize = mcolors.Normalize(vmin=nValues.min(), vmax=nValues.max())
colormap = cm.jet

# plot
for n in nValues:
    plt.plot(dataset[n], color=colormap(normalize(n)))

# setup the colorbar
scalarmappaple = cm.ScalarMappable(norm=normalize, cmap=colormap)
scalarmappaple.set_array(nValues)
plt.colorbar(scalarmappaple)

# show the figure
plt.show()

結果:

在此輸入圖像描述

這幾乎與其他一些問題重復。 關鍵是matplotlib需要一個ScalarMappable實例(通常是圖像,散點圖等)來制作顏色圖。 如果你沒有使用創建一個的繪圖方法,那么偽造一個是直截了當的。 您需要一個Normalize實例來定義colormap的min / max / scaling / etc,並使用Colormap實例來定義顏色。

但是,你有額外的皺紋。 你沒有使用色圖,所以你需要構建一個。

這是一個帶有離散色圖的示例:

import numpy as np
import matplotlib.colors as mcolors
import matplotlib.cm
import matplotlib.pyplot as plt

# Your example...
nvalues = range(0,30)
xvalues = np.linspace(0,10)

hsv2rgb = lambda hue: mcolors.hsv_to_rgb([hue,0.9,0.7])
hues = np.linspace(0, 0.7, len(nvalues))
colors = [hsv2rgb(hue) for hue in hues]

dataset = [(xvalues-5-0.5*n)**2 for n in nvalues]

fig, ax = plt.subplots()
for n in nvalues:
    ax.plot(dataset[n], color=colors[n])

# Fake a ScalarMappable so you can display a colormap
cmap, norm = mcolors.from_levels_and_colors(range(len(nvalues) + 1), colors)
sm = matplotlib.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array([])

fig.colorbar(sm)

plt.show()

在此輸入圖像描述

如果您更喜歡連續的色彩映射:

import numpy as np
import matplotlib.colors as mcolors
import matplotlib.cm
import matplotlib.pyplot as plt

# Your example...
nvalues = range(0,30)
xvalues = np.linspace(0,10)

hsv2rgb = lambda hue: mcolors.hsv_to_rgb([hue,0.9,0.7])
hues = np.linspace(0, 0.7, len(nvalues))
colors = [hsv2rgb(hue) for hue in hues]

dataset = [(xvalues-5-0.5*n)**2 for n in nvalues]

fig, ax = plt.subplots()
for n in nvalues:
    ax.plot(dataset[n], color=colors[n])

# Fake a ScalarMappable so you can display a colormap
cmap = mcolors.LinearSegmentedColormap.from_list('my_cmap', colors)
norm = mcolors.Normalize(min(nvalues), max(nvalues))
sm = matplotlib.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array([])

fig.colorbar(sm)

plt.show()

在此輸入圖像描述

你必須創建一個新的cmap這段代碼應該工作:

import matplotlib
import matplotlib.pyplot as plt 
import colorsys
import numpy

nValues = range(30)
xValues = numpy.linspace(0,10)
dataset = [(xValues-5-0.5*n)**2 for n in nValues]
colors  = [colorsys.hsv_to_rgb(hue,0.9,0.7) for hue in numpy.linspace(0.,0.7,30)]

fig = plt.figure()
axe = fig.add_subplot(111)
trh = [axe.plot(dataset[n],color=colors[n]) for n in nValues] # one line loop for plotting the data with associated color
cma = matplotlib.colors.ListedColormap(colors, name='from_list', N=None) # creation of a user cmap
msm = matplotlib.cm.ScalarMappable(cmap=cma) 
msm.set_array(nValues) 
fig.colorbar(msm)
fig.show()

暫無
暫無

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

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