gpt4 book ai didi

python - 如何向这样创建的散点图添加颜色条?

转载 作者:太空宇宙 更新时间:2023-11-03 21:36:20 25 4
gpt4 key购买 nike

我用代码创建散点图,本质上是这样的

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')

我的问题是这样的:

What do I need add to the code above to get a vertical colorbar (representing the colormap in cmap) along the plot's right edge?

注意:我发现 Matplotlib 完全难以理解,这对于它的设计和文档都是如此。 (并不是因为缺乏尝试:我投入了大量的时间、精力,甚至一些金钱。)所以我会欣赏完整的、有效的代码(即使它只是一个玩具示例),因为我很可能不会'无法填写省略的细节或修复代码中的错误。

<小时/>

编辑:我修复了上面“代码草图”中的一个重要遗漏,即每次调用ax.scatter时的特定于记录的标记规范。这就是通过多次调用 ax.scatter 来创建散点图的原因,尽管无可否认,至少可以将 scatter 的调用次数减少到每个使用的制造商形状一次;例如

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 的调用减少到一个,但这一要求似乎与我对多个标记形状的绝对要求相冲突相同的散点图。

最佳答案

如果您必须为每组使用不同的标记,则必须做一些额外的工作并强制所有 clims相同(否则它们默认从每个散点图 c 数据的最小值/最大值进行缩放)。

from pylab import *
import matplotlib.lines as mlines
import itertools
fig = gcf()
ax = fig.gca()

# make some temorary arrays
X = []
Y = []
C = []
cb = None
# generate fake data
markers = ['','o','*','^','v']
cmin = 0
cmax = 1
for record,marker in itertools.izip(range(5),itertools.cycle(mlines.Line2D.filled_markers)):
    x = rand(50)
    y = rand(50)
    c = rand(1)[0] * np.ones(x.shape)
    if cb is None:
        s = ax.scatter(x,y,c=c,marker=markers[record],linewidths=0)
        s.set_clim([cmin,cmax])
        cb = fig.colorbar(s)
    else:
        s = ax.scatter(x,y,c=c,marker=markers[record],linewidths=0)
        s.set_clim([cmin,cmax])

cb.set_label('Cbar Label Here')

linewidths=0设置形状上边框的宽度,我发现对于小形状,黑色边框可以压倒填充的颜色。

colored scatter plot

如果您只需要一种形状,则可以使用单个散点图来完成这一切,无需为每次循环创建一个单独的散点图。

from pylab import *
fig = gcf()
ax = fig.gca()

# make some temorary arrays
X = []
Y = []
C = []
# generate fake data
for record in range(5):
x = rand(50)
y = rand(50)
c = rand(1)[0] * np.ones(x.shape)
print c
X.append(x)
Y.append(y)
C.append(c)

X = np.hstack(X)
Y = np.hstack(Y)
C = np.hstack(C)

将数据全部打入一维数组后,绘制散点图,并保留返回值:

s = ax.scatter(X,Y,c=C)

然后,您制作颜色条并传递 scatter 返回的对象作为第一个参数。

cb = plt.colorbar(s)
cb.set_label('Cbar Label Here')

您需要执行此操作,以便颜色栏知道要使用哪种颜色贴图(贴图和范围)。

enter image description here

关于python - 如何向这样创建的散点图添加颜色条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53227544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com