Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据列表中的值在绘图中设置标记_Python_Matplotlib_Plot - Fatal编程技术网

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
更有效。作为旁注,如果你不设置点的大小或颜色,在没有连接线的情况下使用
绘图
,效率更高。