本質的には次のようなコードで散布図を作成します
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
が、確かに、使用される maker shape ごとに scatter への呼び出しの数を少なくとも 1 つに減らすことができます。例えば
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
1 つにまとめようとしました (一連のマーカーを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 のレシピでは、呼び出しを 1 つに減らす必要がありax.scatter
ますが、この要件は、同じ散布図内の複数のマーカー形状に対する私の絶対要件と競合するようです。