Python 根据列表中的值在绘图中设置标记
假设我有一个如下所示的列表:Python 根据列表中的值在绘图中设置标记,python,matplotlib,plot,Python,Matplotlib,Plot,假设我有一个如下所示的列表: list_a = [[1.2, 0.5, 3.1,...], [7.3, 1.5, 3.9,...], [100, 200, 150, ...]] 该列表中的第一个子列表和第二个子列表定义了我要绘制的(x,y)值。第三个子列表包含与每个(x,y)点(比如某个属性)相关的值。这些关联值只能是三个值中的一个:100150200;这意味着每个(x,y)对附加了100、150或200值 我想在散点图中绘制这些(x,y)点,但根据第三个列表中的值为每个点指定一个标记 例如,
list_a = [[1.2, 0.5, 3.1,...], [7.3, 1.5, 3.9,...], [100, 200, 150, ...]]
该列表中的第一个子列表和第二个子列表定义了我要绘制的(x,y)
值。第三个子列表包含与每个(x,y)
点(比如某个属性)相关的值。这些关联值只能是三个值中的一个:100150200
;这意味着每个(x,y)
对附加了100
、150
或200
值
我想在散点图中绘制这些(x,y)
点,但根据第三个列表中的值为每个点指定一个标记
例如,我想要(当然不是真正的代码):
我能想到的唯一方法是重新打包list_a
,以便将与第三个列表中相同值关联的所有(x,y)
对移动到其自己的列表中,如下所示:
list_100 =[[subset of x values], [subset of y values]]
list_150 =[[subset of x values], [subset of y values]]
list_200 =[[subset of x values], [subset of y values]]
然后分别绘制每个列表,每次设置适当的标记:
plot.scatter(list_100[0], list_100[1], marker='o')
plot.scatter(list_150[0], list_150[1], marker='s')
plot.scatter(list_200[0], list_200[1], marker='^')
我想知道是否有一种方法可以做到这一点,而无需重新打包原始列表,然后为第三个子列表中的每个值设置几个单独的绘图。因为您只有三个关联值,并且您知道相应的绘图值, 因此,将每个关联值映射到绘图值:
plot_map = { 100:'o' ,150:'s' , 200:'^' }
现在,由于每个子列表将具有相等的元素:
for i in range(len(list_a[0])):
plot.scatter(list_a[0][i], list_a[1][i], plot_map[list_a[2][i]])
因为您只有三个关联值,并且您知道相应的绘图值, 因此,将每个关联值映射到绘图值:
plot_map = { 100:'o' ,150:'s' , 200:'^' }
现在,由于每个子列表将具有相等的元素:
for i in range(len(list_a[0])):
plot.scatter(list_a[0][i], list_a[1][i], plot_map[list_a[2][i]])
像这样的东西行吗?它会重新排列您的列表,因此它的效率可能不如您所希望的那样高,但我认为它对您很有用
list_a = [[1.2, 0.5, 3.1, 4.0, 2.3, 6.7],
[7.3, 1.5, 3.9, 2.7, 1.4, 9.1],
[100, 200, 150, 200, 100, 100]]
markers = [(100, 'o'), (150, 's'), (200, '^')]
list_r = zip(*list_a)
for value, marker in markers:
def f(p):
return p[2] == value
sublist_r = filter(f, list_r)
sublist = zip(*sublist_r)
plot.scatter(sublist[0], sublist[1], marker=marker)
与较小的@roshan解决方案相比,它的优势在于它为您拥有的每种类型的标记调用
plot.scatter
一次,而不是为每一点调用一次。这样做可以吗?它会重新排列您的列表,因此它的效率可能不如您所希望的那样高,但我认为它对您很有用
list_a = [[1.2, 0.5, 3.1, 4.0, 2.3, 6.7],
[7.3, 1.5, 3.9, 2.7, 1.4, 9.1],
[100, 200, 150, 200, 100, 100]]
markers = [(100, 'o'), (150, 's'), (200, '^')]
list_r = zip(*list_a)
for value, marker in markers:
def f(p):
return p[2] == value
sublist_r = filter(f, list_r)
sublist = zip(*sublist_r)
plot.scatter(sublist[0], sublist[1], marker=marker)
与较小的@roshan解决方案相比,它的优势在于,它为您拥有的每种类型的标记调用一次plot.scatter
,而不是为每个点调用一次。使用以下方法:
list_a = [[1.2, 0.5, 3.1,...], [7.3, 1.5, 3.9,...], [100, 200, 150, ...]]
import numpy as np
x = np.asarray(list_a[0])
y = np.asarray(list_a[1])
m = np.asarray(list_a[2])
mrk = {100:'o',150:'s',200:'^'}
for key,value in mrk.items():
s1 = (m==key)
plt.scatter(x[s1],y[s1],marker=value)
这确实非常有效。使用以下方法:
list_a = [[1.2, 0.5, 3.1,...], [7.3, 1.5, 3.9,...], [100, 200, 150, ...]]
import numpy as np
x = np.asarray(list_a[0])
y = np.asarray(list_a[1])
m = np.asarray(list_a[2])
mrk = {100:'o',150:'s',200:'^'}
for key,value in mrk.items():
s1 = (m==key)
plt.scatter(x[s1],y[s1],marker=value)
这确实非常有效。我不明白第三个列表与前两个列表是如何联系在一起的。请澄清。例如,您将如何创建
列表_100
,它将包含(x,y)个点中的哪一个?我已经重新考虑了这个问题,现在是否更好了?每个调用下的分散
工作方式只能有一个标记形状(然后可以调整大小和颜色).我不明白第三份名单和前两份有什么联系。请澄清。例如,您将如何创建列表_100
,它将包含(x,y)个点中的哪一个?我已经重新考虑了这个问题,现在是否更好了?每个调用下的分散
工作方式只能有一个标记形状(然后可以调整大小和颜色)。这有一个缺点,它为每个点调用plot
,对于大型数据集来说速度非常慢。这有一个缺点,它为每个点调用plot
,对于大型数据集来说速度非常慢。这应该行得通,但它会重新排列列表,这正是我想要避免的。如果没有其他答案而不需要重新排列列表,我会将此标记为已接受。我不熟悉matlab的API,因此我不知道您所问的是否可行。如果只有plot.scatter
,我想你必须重新安排。这应该行得通,但它会重新安排列表,这正是我想要避免的。如果没有其他答案而不需要重新排列列表,我会将此标记为已接受。我不熟悉matlab的API,因此我不知道您所问的是否可行。如果plot.scatter
就是全部,我想你必须重新安排。作为旁注,如果你不设置点的大小或颜色,使用没有连接线的plot
更有效。作为旁注,如果你不设置点的大小或颜色,在没有连接线的情况下使用绘图
,效率更高。