我用代码创建散点图,本质上是这样的
cmap = (matplotlib.color.LinearSegmentedColormap.
from_list('blueWhiteRed', ['blue', 'white', 'red']))
fig = matplotlib.figure.Figure(figsize=(4, 4), dpi=72)
ax = fig.gca()
for record in data:
level = record.level # a float in [0.0, 1.0]
marker = record.marker # one of 'o', 's', '^', '*', etc.
ax.scatter(record.x, record.y, marker=marker,
c=level, vmin=0, vmax=1, cmap=cmap, **otherkwargs)
# various settings of ticks, labels, etc. omitted
canvas = matplotlib.backends.backend_agg.FigureCanvasAgg(fig)
fig.set_canvas(canvas)
canvas.print_png('/path/to/output/fig.png')
我的问题是这样的:
我需要在上面的代码中添加什么来获得
cmap
沿绘图右边缘的垂直颜色条(代表 中的颜色图)?
注意:我发现 Matplotlib完全难以理解,这既适用于它的设计,也适用于它的文档。(不是因为缺乏尝试:我投入了大量的时间、精力,甚至是一些钱。)所以我会很感激完整的、有效的代码(即使它只是一个玩具示例),因为我很可能会赢无法填写省略的细节或修复代码中的错误。
编辑:我修复了上面“代码草图”中的一个重要遗漏,即每次调用ax.scatter
. 这就是使用多次调用来创建散点图的原因ax.scatter
,尽管不可否认,至少可以将调用 scatter 的次数减少到每个使用的 maker 形状一个;例如
for marker in set(record.marker for record in data):
X, Y, COLOR = zip(*((record.x, record.y, record.level)
for record in data if record.marker == marker))
ax.scatter(X, Y, marker=marker,
c=COLOR, vmin=0, vmax=1, cmap=cmap,
**otherkwargs)
我尝试扩展相同的技巧以将所有调用ax.scatter
合并为一个(通过传递一系列标记作为marker
参数),如下所示:
X, Y, COLOR, MARKER = zip(*((record.x, record.y, record.level, record.marker)
for record in data))
ax.scatter(X, Y, marker=MARKER,
c=COLOR, vmin=0, vmax=1, cmap=cmap,
**otherkwargs)
...但这失败了。错误是这样的(修剪一些长路径之后):
Traceback (most recent call last):
File "src/demo.py", line 222, in <module>
main()
File "src/demo.py", line 91, in main
**otherkwargs)
File "<abbreviated-path>/matplotlib/axes.py", line 6100, in scatter
marker_obj = mmarkers.MarkerStyle(marker)
File "<abbreviated-path>/matplotlib/markers.py", line 113, in __init__
self.set_marker(marker)
File "<abbreviated-path>/matplotlib/markers.py", line 179, in set_marker
raise ValueError('Unrecognized marker style {}'.format(marker))
ValueError: Unrecognized marker style ('^', 'o', '^', '*', 'o', 's', 'o', 'o', '^', 's', 'o', 'o', '^', '^', '*', 'o', '*', '*', 's', 's', 'o', 's', 'o', '^', 'o', 'o', '*', '^', 's', '^', '^', 's', '*')
AFAICT,tcaswell 的配方需要将调用减少ax.scatter
到一个,但这个要求似乎与我对同一散点图中多个标记形状的绝对要求相冲突。