根据第三个变量改变散点图中的标记样式

22

我正在处理一个多列词典。我想绘制两列,并根据第三列和第四列的数据更改标记的颜色和样式。

在pylab散点图中,我无法成功更改标记的样式,尽管我的方法可以更改颜色。

x=[1,2,3,4,5,6]
y=[1,3,4,5,6,7]
m=['k','l','l','k','j','l']

for i in xrange(len(m)):
    m[i]=m[i].replace('j','o')
    m[i]=m[i].replace('k','x')
    m[i]=m[i].replace('l','+')

plt.scatter(x,y,marker=m)
plt.show()
3个回答

22
问题在于marker只能是单个值,而不是标记列表,就像color参数一样。你可以按标记值进行分组,以便拥有具有相同标记的x和y列表,并对它们进行绘图。
xs = [[1, 2, 3], [4, 5, 6]]
ys = [[1, 2, 3], [4, 5, 6]]
m = ['o', 'x']
for i in range(len(xs)):
    plt.scatter(xs[i], ys[i], marker=m[i])
plt.show()

或者您可以绘制每一个点(但我不建议这样做):

x=[1,2,3,4,5,6]
y=[1,3,4,5,6,7]
m=['k','l','l','k','j','l']

mapping = {'j' : 'o', 'k': 'x', 'l': '+'}

for i in range(len(x)):
    plt.scatter(x[i], y[i], marker=mapping[m[i]])
plt.show()

1
啊哈,这正是我刚刚发现自己在与之搏斗的——文档说标记可以像数组一样,这似乎有点误导。感谢您清楚地说明了这一点。 - Thomas Kimber

17

在 Viktor Kerkez 的回答基础上,利用一点 Numpy,您可以像下面这样做:

x = np.array([1,2,3,4,5,6])
y = np.array([1,3,4,5,6,7])
m = np.array(['o','+','+','o','x','+'])

unique_markers = set(m)  # or yo can use: np.unique(m)

for um in unique_markers:
    mask = m == um 
    # mask is now an array of booleans that can be used for indexing  
    plt.scatter(x[mask], y[mask], marker=um)

8

对我来说最简单的解决方案是使用pandasseaborn:

import pandas as pd   # '0.25.3'
import seaborn as sns # '0.9.0'

data = pd.DataFrame(
    dict(x=[1,2,3,4,5,6],
    y=[1,3,4,5,6,7],
    m=['k','l','l','k','j','l'],)
)

sns.scatterplot(data=data, x='x', y='y', style='m')

绘图

seaborn会自动为您选择标记样式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接