【问题标题】:Matplotlib scatter plot with array of y values for each xMatplotlib 散点图,每个 x 的 y 值数组
【发布时间】:2019-10-20 04:56:53
【问题描述】:

这与Python Scatter Plot with Multiple Y values for each X 类似;也就是说,我的数据是:

data = [
  [1, [15, 16, 17, 18, 19, 20]],
  [2, [21, 22, 23, 24, 25, 26]],
  [3, [27, 28, 29, 30, 31, 32]],
]

... 所以第一列 (0) 是 x 坐标,第二列 (1) 包含对应于单个 x 坐标的 y 值数组。而且,我想将其绘制为散点图,我能做的最好的就是这个(下面的代码):

与链接帖子中的相同,我必须使用三个ax.scatter 图,因此我们有三种颜色,每列一种。

所以我的问题是:

  • 我可以发出一个ax.scatter 命令来从我拥有的数据中(而不是发出三个命令)得到一个像上面那样的图(但使用单一颜色/标记)?
  • 或者,我能否以某种方式转换我拥有的数据,以便使用单个 ax.scatter 命令获得与上述类似的图(但使用单一颜色/标记)?

代码如下:

#!/usr/bin/env python3

import sys
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
print("versions: Python {} matplotlib {} numpy {}".format(sys.version.replace('\n', ''), matplotlib.__version__, np.version.version))


data = [
  [1, [15, 16, 17, 18, 19, 20]],
  [2, [21, 22, 23, 24, 25, 26]],
  [3, [27, 28, 29, 30, 31, 32]],
]

ndata = np.asarray(data, dtype=object)

fig = plt.figure()

# Null formatter
ax = fig.add_subplot(1, 1, 1)

print()
print(ndata[1])
print(ndata[:,0].astype(float))
print(ndata[:,1])

datay_2D = np.stack(ndata[:,1], axis=0) # convert numpy array of lists to numpy 2D array
print()
print(datay_2D[:,0])
print(datay_2D[0])
print([ndata[:,0][0]]*len(datay_2D[0]))

ax.scatter([ndata[:,0][0]]*len(datay_2D[0]), datay_2D[0], marker="x")
ax.scatter([ndata[:,0][1]]*len(datay_2D[1]), datay_2D[1], marker="x")
ax.scatter([ndata[:,0][2]]*len(datay_2D[1]), datay_2D[2], marker="x")

plt.show()

打印输出:

versions: Python 3.6.8 (default, Oct  7 2019, 12:59:55) [GCC 8.3.0] matplotlib 2.1.1 numpy 1.13.3

[2 list([21, 22, 23, 24, 25, 26])]
[ 1.  2.  3.]
[list([15, 16, 17, 18, 19, 20]) list([21, 22, 23, 24, 25, 26])
 list([27, 28, 29, 30, 31, 32])]

[15 21 27]
[15 16 17 18 19 20]
[1, 1, 1, 1, 1, 1]

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    我想所有 y 值的列表都具有相同的长度?那样的话

    import numpy as np
    import matplotlib.pyplot as plt
    
    data = [
      [1, [15, 16, 17, 18, 19, 20]],
      [2, [21, 22, 23, 24, 25, 26]],
      [3, [27, 28, 29, 30, 31, 32]],
    ]
    
    x, y = zip(*data)
    y = np.array(y)
    
    plt.scatter(np.repeat(x, y.shape[1]), y.flat)
    
    plt.show()
    

    【讨论】:

    • 感谢@ImportanceOfBeingErnest - 是的,所有 y 值列表的长度都相同。有趣的方法,为绘图创建一个足够长的 x 数组,然后将 y 展平为 1D 数组 - 将其作为参考很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    相关资源
    最近更新 更多