Krn*_*Krn 13 python dictionary scatter matplotlib marker
我正在处理一个多列字典.我想绘制两列,然后根据第三和第四列更改标记的颜色和样式.
我很难改变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()
Run Code Online (Sandbox Code Playgroud)
Vik*_*kez 13
问题是,marker
只能是单个值而不是标记列表,如color
parmeter.
您可以按标记值进行分组,这样您就可以使用具有相同标记的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()
Run Code Online (Sandbox Code Playgroud)
或者你可以绘制每一个点(我不推荐):
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()
Run Code Online (Sandbox Code Playgroud)
Jan*_*ken 10
添加到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 van be used for indexing
plt.scatter(x[mask], y[mask], marker=um)
Run Code Online (Sandbox Code Playgroud)
对我来说最简单的解决方案是使用pandas
and seaborn
:
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')
Run Code Online (Sandbox Code Playgroud)
seaborn
自动为您选择标记样式。