Python scatter - 根据实体更改标记样式

Python scatter - change marker style based on entity

我为解决这个问题苦苦挣扎了好几天:我在 y 轴上有笛卡尔坐标(深度从 0 到 1),在 x 轴上有不同值的数字(数字是发射率y 轴上给定深度处的不同细胞群,因此它们随机变化)。 我想在散点图中显示更大尺寸的标记,对应于更大的 x 轴值(发射率)。 谢谢你的任何建议。 这是代码(无效)。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cbook as cbook

x = np.genfromtxt('x_dex.csv', delimiter=',')

y = np.genfromtxt('z_dex.csv', delimiter=',')

array = [i for i in x if i > 4]
array.sort()

s = [30*2**n for n in range(len(array))];

plt.subplot(212)

plt.scatter(x,y,s=s)

plt.show()

不幸的是,这没有显示标记大小和深度之间的正确关系。

我认为您计算 'size' 值的行不正确:

s = [30*2**n for n in range(len(array))];

这将为您提供一个包含以下内容的列表:

s = [30*2**0, 30*2**1, 30*2**2, ..., 30*2**(len(array) - 1)]

这些值与 y 无关,因此我认为这不是您想要的。也许您的意思更像是这样:

s = 30 * 2 ** y

这里其实还有其他几个问题:

  • 不要给你的变量起像 array 这样的名字——这会导致与 numpy.array 混淆。在这种情况下更糟,因为 array 实际上不是数组而是 Python list!

  • 由于您处理的是 numpy 数组,因此使用矢量化比使用列表理解要快得多。例如,您可以使用:

    array = x[x > 4]
    

    而不是

    array = [i for i in x if i > 4]
    
  • 在你的列表理解 array = [i for i in x if i > 4] 之后,如果 array 中的元素是小于 4.

  • array.sort()会将列表原位排序,也就是说array中元素的顺序将不再匹配y.

  • 中元素的顺序
  • 事实上,在这种情况下排序似乎毫无意义 - 因为您正在制作散点图,所以点的顺序无关紧要。

  • 您不再编写 MATLAB 代码,因此无需以分号结束行(尽管这样做不会造成任何伤害)。


这是我对您要执行的操作的有根据的猜测:

import matplotlib.pyplot as plt
import numpy as np

x = np.genfromtxt('x_dex.csv', delimiter=',')
y = np.genfromtxt('z_dex.csv', delimiter=',')

# get the set of indices that will sort x in ascending order, apply these
# to both x & y
order = np.argsort(x)
x_sorted = x[order]
y_sorted = y[order]

# keep only xy pairs where x > 4
valid = x_sorted > 4
x_valid = x_sorted[valid]
y_valid = y_sorted[valid]

# compute the sizes
s = 30 * 2 ** y_valid

# plot
plt.subplot(212)
plt.scatter(x_valid, y_valid, s=s)

plt.show()