matplotlib

时间:2016-04-23 10:13:31

标签: python matplotlib markers

我有两个包含某些点的x和y坐标的列表。还有一个列表,其中为每个点分配了一些值。现在我的问题是,我总是可以使用python中的标记来绘制点(x,y)。我也可以手动选择标记的颜色(如本代码所示)。

import matplotlib.pyplot as plt

x=[0,0,1,1,2,2,3,3]
y=[-1,3,2,-2,0,2,3,1]
colour=['blue','green','red','orange','cyan','black','pink','magenta']
values=[2,6,10,8,0,9,3,6]

for i in range(len(x)):
    plt.plot(x[i], y[i], linestyle='none', color=colour[i], marker='o')

plt.axis([-1,4,-3,4])
plt.show()

但是可以根据分配给该点的值(使用cm.jet,cm.gray或类似的其他颜色方案)为标记特定点的标记选择颜色,并提供带有该图的颜色条吗? / p>

例如,这是我正在寻找的那种情节

enter image description here

其中红点表示高温点,蓝点表示低温点,其他表示中间温度。

1 个答案:

答案 0 :(得分:4)

您最有可能寻找matplotlib.pyplot.scatter。例如:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

# Generate data:
N = 10
x = np.linspace(0, 1, N)
y = np.linspace(0, 1, N)
x, y = np.meshgrid(x, y)
colors = np.random.rand(N, N) # colors for each x,y

# Plot
circle_size = 200
cmap = matplotlib.cm.viridis # replace with your favourite colormap 
fig, ax = plt.subplots(figsize=(4, 4))
s = ax.scatter(x, y, s=circle_size, c=colors, cmap=cmap)

# Prettify
ax.axis("tight")
fig.colorbar(s)

plt.show()

注意:较旧版本的matplotlib上的viridis可能会失败。 结果图片:

Circles coloured by colormap

修改

scatter不需要输入数据为2-D,这里有4个生成相同图像的替代方案:

import matplotlib
import matplotlib.pyplot as plt

x = [0,0,1,1,2,2,3,3]
y = [-1,3,2,-2,0,2,3,1]
values = [2,6,10,8,0,9,3,6]
# Let the colormap extend between:
vmin = min(values)
vmax = max(values)

cmap = matplotlib.cm.viridis
norm = matplotlib.colors.Normalize(vmin=vmin, vmax=vmax)

fig, ax = plt.subplots(4, sharex=True, sharey=True)
# Alternative 1: using plot:
for i in range(len(x)):
    color = cmap(norm(values[i]))
    ax[0].plot(x[i], y[i], linestyle='none', color=color, marker='o')

# Alternative 2: using scatter without specifying norm
ax[1].scatter(x, y, c=values, cmap=cmap)

# Alternative 3: using scatter with normalized values:
ax[2].scatter(x, y, c=cmap(norm(values)))

# Alternative 4: using scatter with vmin, vmax and cmap keyword-arguments
ax[3].scatter(x, y, c=values, vmin=vmin, vmax=vmax, cmap=cmap)

plt.show()