【问题标题】:matplotlib: Plot numpy arrays with None as valuesmatplotlib:以 None 为值绘制 numpy 数组
【发布时间】:2013-11-08 18:48:38
【问题描述】:

我有一个看起来像这样的数组:

k = numpy.array([(1.,0.001), (1.1, 0.002), (None, None), 
                 (1.2, 0.003), (0.99, 0.004)])

我想绘制不是(None, None) 的值并保留数组值的索引。也就是说,只要有 (None, None) 值,我就想要一个间隙。

完成后我想绘制

y = k[:,0] + k[:,1]

但我什至无法将数组添加在一起。我尝试屏蔽数组,但丢失了原始k 数组的索引值。

一个最小的例子:

import matplotlib.pyplot as pyplot
import numpy

x = range(5)
k = numpy.array([(1.,0.001), (1.1, 0.002), (None, None), 
                 (1.2, 0.003), (0.99, 0.004)])

Fig, ax = pyplot.subplots()

# This plots a gap---as desired
ax.plot(x, k[:,0], 'k-')

# I'd like to plot
#     k[:,0] + k[:,1]
# but I can't add None

# Here I get rid of the (None, None) values so I can add
# But I lose the original indexing
mask = k != (None, None)
y = k[mask].reshape((-1,2))

ax.plot(range(len(y)), y[:,0]+y[:,1], 'k--')

【问题讨论】:

    标签: python arrays numpy matplotlib nonetype


    【解决方案1】:

    您可以使用 numpy.nan 代替 None。

    import matplotlib.pyplot as pyplot
    import numpy
    
    x = range(5)
    k = numpy.array([(1.,0.001), (1.1, 0.002), (numpy.nan, numpy.nan), 
                     (1.2, 0.003), (0.99, 0.004)])
    
    Fig, ax = pyplot.subplots()
    
    # This plots a gap---as desired
    ax.plot(x, k[:,0], 'k-')
    
    ax.plot(range(len(y)), y[:,0]+y[:,1], 'k--')
    

    或者您也可以屏蔽 x 值,因此 x 和 y 之间的索引是一致的

    import matplotlib.pyplot as pyplot
    import numpy
    
    x = range(5)
    y = numpy.array([(1.,0.001), (1.1, 0.002), (numpy.nan, numpy.nan), 
                     (1.2, 0.003), (0.99, 0.004)])
    
    Fig, ax = pyplot.subplots()
    
    
    ax.plot(range(len(y)), y[:,0]+y[:,1], 'k--')
    import matplotlib.pyplot as pyplot
    import numpy
    
    x = range(5)
    k = numpy.array([(1.,0.001), (1.1, 0.002), (None, None), 
                     (1.2, 0.003), (0.99, 0.004)])
    
    Fig, ax = pyplot.subplots()
    
    # This plots a gap---as desired
    ax.plot(x, k[:,0], 'k-')
    
    # I'd like to plot
    #     k[:,0] + k[:,1]
    # but I can't add None
    
    arr_none = np.array([None])
    mask = (k[:,0] == arr_none) | (k[:,1] == arr_none)
    
    ax.plot(numpy.arange(len(y))[mask], k[mask,0]+k[mask,1], 'k--')
    

    【讨论】:

    • 这个简单的例子我可以,但是我从另一个来源获取数据,所以我无法控制它。
    • 你不能代替剧情吗?你能做你正在做的事情,但在情节中也掩盖 x 值吗?
    • 这几乎奏效了。创建掩码时,您需要将 None 设为像 Saullo 的答案一样的数组。
    • 我已经做出改变了。
    【解决方案2】:

    你可以过滤你的数组:

    test = np.array([None])
    k = k[k!=test].reshape(-1, 2).astype(float)
    

    然后对列进行汇总并绘制图表。您的方法的问题是您没有将 None 类型转换为 numpy 数组,这不允许正确创建掩码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-22
      • 2021-06-16
      • 1970-01-01
      • 2021-09-28
      • 2012-07-07
      • 1970-01-01
      • 2016-05-23
      相关资源
      最近更新 更多