matplotlib: Plot numpy arrays with None as values

16,640

Solution 1

You can use numpy.nan instead of 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--')

Or you could mask the x value as well, so the indices were consistent between x and 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--')

Solution 2

You can filter you array doing:

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

And then sum up the columns and make the plot. The problem of your approach is that you did not convert the None type to a numpy array, which did not allow the proper creation of the mask.

Share:
16,640
jlconlin
Author by

jlconlin

Updated on June 04, 2022

Comments

  • jlconlin
    jlconlin almost 2 years

    I have an array that looks like:

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

    I want to plot the values that are not (None, None) and keep the index of the array value. That is, I want a gap wherever there is a (None, None) value.

    When that is done I'd like to plot

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

    but I can't even add the arrays together. I tried masking the array, but I lost the index values of the original k array.

    A minimal example:

    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--')
    
  • jlconlin
    jlconlin over 10 years
    I could for this simple example, but I get my data from another source so I can't control it.
  • Greg Whittier
    Greg Whittier over 10 years
    and you can't substitute for the plot? Could you do what you're doing, but mask x value also in the plot?
  • jlconlin
    jlconlin over 10 years
    This almost worked. When creating the mask you need to make None an array like Saullo's answer.
  • Greg Whittier
    Greg Whittier over 10 years
    I've made the change.