Python分散 - 基于实体更改标记样式

时间:2015-03-05 17:12:55

标签: python csv numpy matplotlib

我努力解决这个问题几天了:我在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()

遗憾的是,这并未显示标记大小与深度之间的正确关系。

1 个答案:

答案 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