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()
我为解决这个问题苦苦挣扎了好几天:我在 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
实际上不是数组而是 Pythonlist
!由于您处理的是 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()