我正在尝试制作一个简单的图表,显示属于具有特定顺序的大型数据集的许多曲线,假设情节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中获取我的绘图颜色,我认为事情可能会更容易,但我也不知道如何做到这一点,我也不知道如何从那里开始。
欢迎任何指示!
答案 0 :(得分:6)
@tom和@Joe Kington都是对的:之前有人问过。但是,我尝试以相关答案的轻微努力为例。
要使用色彩映射(始终将值从[0,1]映射到颜色),首先需要规范化数据。为此,您可以使用Normalize
类。只有在您打算创建颜色栏时才需要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()
结果:
答案 1 :(得分:4)
这几乎与其他几个问题重复。关键是matplotlib需要一个{
"version": "1.0.0",
"stat_tag": "API",
"layers": [{
"type": "cartodb",
"options": {
"sql": "SELECT * FROM mytable)",
"cartocss": "mytable{marker-width: 10;}",
"cartocss_version": "2.1.0"
}
}
//INSERT NEW OBJECT HERE
]
}
实例(通常是图像,散点图等)来制作颜色图。如果你不使用创建一个的绘图方法,那么直接伪造一个。您需要一个ScalarMappable
实例来定义色彩映射的最小/最大/缩放/等,并使用Normalize
实例来定义颜色。
然而,你还有额外的皱纹。您没有使用色彩映射表,因此您需要构建一个色彩映射表。
这是一个带有离散色图的示例:
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()
答案 2 :(得分:1)
您必须创建一个新的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()