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