Matplotlib 定义散点图的标记

Matplotlib 定义散点图的标记,matplotlib,scatter-plot,Matplotlib,Scatter Plot,我想根据数据中的值在绘图中定义标记 代码在这里 data = np.loadtxt("data.txt") x1 = data[:,3] y1 = data[:,10] z = data[:,1] mf = data[:,0] n_file=len(x1) mrk=[None] fig, ax1 = plt.subplots() fig.set_size_inches(18.5/2, 10.5/2) for i in range(len(x1))

我想根据数据中的值在绘图中定义标记

代码在这里

data = np.loadtxt("data.txt")
x1 = data[:,3]
y1 = data[:,10]
z = data[:,1]
mf = data[:,0]

n_file=len(x1)
mrk=[None]



fig, ax1 = plt.subplots()                   
fig.set_size_inches(18.5/2, 10.5/2)


for i in range(len(x1)):

        if mf[i] ==1:
            mrk={'o'}
        elif mf[i] ==2:
            mrk={'s'}
        elif mf[i] ==3:
            mrk={'*'}
        elif mf[i] ==4:
            mrk={'+'}
        else: 
            mrk={'x'}

        sc=plt.scatter(x1[i],y1[i], marker=mrk)


plt.show()
它返回: TypeError:无法损坏的类型:“set”


谢谢

这里似乎没有任何理由使用电视机。只需使用字符串,即使用
mrk='o'
而不是
mrk='o'

此外,如果已知
mf
中的可能值,您当然可以使用字典来定义映射

mapping = {1 : "o", 2 : "s", 3 : "*", 4 : "+", 5 : "x"}

for i in range(len(x1)):
    sc=plt.scatter(x1[i],y1[i], marker=mapping[mf[i]])
编辑

实际上,您可以通过使用
dict.get()
方法或使用
defaultdict
来绕过
KeyError
问题。下面的示例利用了两种可能性,将
”作为标记的默认值。

from matplotlib import pyplot as plt
import numpy as np
from collections import defaultdict

x1 = np.random.random(100)
y1 = np.random.random(100)
mf = np.random.choice(np.arange(10),100)

fig, axes = plt.subplots(ncols=2)

##using the 'dict.get()' method
mapping1 = {1 : "o", 2 : "s", 3 : "*", 4 : "+", 5 : "x"}
for i in range(len(x1)):
    sc=axes[0].scatter(x1[i],y1[i], marker=mapping1.get(mf[i],'.'))

##using a defaultdict
mapping2=defaultdict(lambda: '.', mapping1)
for i in range(len(x1)):
    sc=axes[1].scatter(x1[i],y1[i], marker=mapping2[mf[i]])

plt.show()
结果确实相同:


这里似乎没有任何理由使用集合。只需使用字符串,即使用
mrk='o'
而不是
mrk='o'

此外,如果已知
mf
中的可能值,您当然可以使用字典来定义映射

mapping = {1 : "o", 2 : "s", 3 : "*", 4 : "+", 5 : "x"}

for i in range(len(x1)):
    sc=plt.scatter(x1[i],y1[i], marker=mapping[mf[i]])
编辑

实际上,您可以通过使用
dict.get()
方法或使用
defaultdict
来绕过
KeyError
问题。下面的示例利用了两种可能性,将
”作为标记的默认值。

from matplotlib import pyplot as plt
import numpy as np
from collections import defaultdict

x1 = np.random.random(100)
y1 = np.random.random(100)
mf = np.random.choice(np.arange(10),100)

fig, axes = plt.subplots(ncols=2)

##using the 'dict.get()' method
mapping1 = {1 : "o", 2 : "s", 3 : "*", 4 : "+", 5 : "x"}
for i in range(len(x1)):
    sc=axes[0].scatter(x1[i],y1[i], marker=mapping1.get(mf[i],'.'))

##using a defaultdict
mapping2=defaultdict(lambda: '.', mapping1)
for i in range(len(x1)):
    sc=axes[1].scatter(x1[i],y1[i], marker=mapping2[mf[i]])

plt.show()
结果确实相同:


谢谢,但它返回:keyrerror:12.5,如前所述“如果已知mf中的可能值”。你不知道你的情况是否如此。如果没有,您需要使用这里的第一个解决方案。事实上,您可以使用
DefaultDict
(或使用
dict.get()
)来绕过keyrerror问题……当然@ThomasKühn,我完全忘记了这个选项。我想你可以提供这个答案,或者,如果你想编辑这个答案,我们把它变成一个社区维基。谢谢你,但它返回:keyrerror:12.5,正如前面所说的“如果mf中的可能值已知”。你不知道你的情况是否如此。如果没有,您需要使用这里的第一个解决方案。事实上,您可以使用
DefaultDict
(或使用
dict.get()
)来绕过keyrerror问题……当然@ThomasKühn,我完全忘记了这个选项。我想你可以提供这个作为答案,或者,如果你想编辑这个答案,我们把它变成一个社区维基。