我努力解决这个问题几天了:我在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()
遗憾的是,这并未显示标记大小与深度之间的正确关系。
答案 0 :(得分:1)
您计算“尺寸”值的行对我来说不正确:
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,则y
会有不同数量的元素array
。
array.sort()
会对列表进行排序,这意味着array
中元素的顺序将不再与{{{}}中元素的顺序相匹配1}}。
事实上,在这种情况下,排序似乎毫无意义 - 因为你正在制作一个散点图,这些点的顺序无关紧要。
你不再编写MATLAB代码,因此不需要在分号上结束行(尽管如果你这样做也不会造成任何伤害)。
这是我对你要做的事情的有根据的猜测:
y