How do you make an errorbar plot in matplotlib using linestyle=None in rcParams?
Question:
When plotting errorbar plots, matplotlib is not following the rcParams of no linestyle. Instead, it’s plotting all of the points connected with a line. Here’s a minimum working example:
import matplotlib.pyplot as plt
lines = {'linestyle': 'None'}
plt.rc('lines', **lines)
plt.errorbar((0, 1), (1, 0), yerr=(0.1, 0.1), marker='o')
plt.savefig('test.pdf')
plt.delaxes()
Is the only solution to explicitly set linestyle='None'
when calling pyplot.errorbar()
?
Answers:
This is a “bug” in older versions of matplotlib
(and has been fixed for the 1.4 series). The issue is that in Axes.errorbar
there is a default value of '-'
for fmt
, which is then passed to the call to plot
which is used to draw the markers and line. Because a format string is passed into plot
in never looks at the default value in rcparams
.
You can also pass in fmt = ''
eb = plt.errorbar(x, y, yerr=.1, fmt='', color='b')
which will cause the rcParam['lines.linestlye']
value to be respected. I have submitted a PRto implement this.
Another work around for this is to make the errorbar in two steps:
l0, = plt.plot(x,y, marker='o', color='b')
eb = plt.errorbar(x, y, yerr=.1, fmt=None, color='b')
This is an annoying design decision, but changing it would be a major api break. Please open an issue on github about this.
errorbar doc.
As a side note, it looks like the call signature was last changed in 2007, and that was to make errorbars not default to blue.
Using: fmt=''
indeed doesn’t work. One needs to put something that is not an empty string.
As mentioned by @strpeter, a dot or any other marker would work.
Examples:
fmt='.'
fmt=' '
fmt='o'
Or use an empty linestyle:
plt.errorbar(x, y, yerr=.1, fmt=None, color='b', linestyle='')
This works for me in matplotlib version 3.3.3
When plotting errorbar plots, matplotlib is not following the rcParams of no linestyle. Instead, it’s plotting all of the points connected with a line. Here’s a minimum working example:
import matplotlib.pyplot as plt
lines = {'linestyle': 'None'}
plt.rc('lines', **lines)
plt.errorbar((0, 1), (1, 0), yerr=(0.1, 0.1), marker='o')
plt.savefig('test.pdf')
plt.delaxes()
Is the only solution to explicitly set linestyle='None'
when calling pyplot.errorbar()
?
This is a “bug” in older versions of matplotlib
(and has been fixed for the 1.4 series). The issue is that in Axes.errorbar
there is a default value of '-'
for fmt
, which is then passed to the call to plot
which is used to draw the markers and line. Because a format string is passed into plot
in never looks at the default value in rcparams
.
You can also pass in fmt = ''
eb = plt.errorbar(x, y, yerr=.1, fmt='', color='b')
which will cause the rcParam['lines.linestlye']
value to be respected. I have submitted a PRto implement this.
Another work around for this is to make the errorbar in two steps:
l0, = plt.plot(x,y, marker='o', color='b')
eb = plt.errorbar(x, y, yerr=.1, fmt=None, color='b')
This is an annoying design decision, but changing it would be a major api break. Please open an issue on github about this.
errorbar doc.
As a side note, it looks like the call signature was last changed in 2007, and that was to make errorbars not default to blue.
Using: fmt=''
indeed doesn’t work. One needs to put something that is not an empty string.
As mentioned by @strpeter, a dot or any other marker would work.
Examples:
fmt='.'
fmt=' '
fmt='o'
Or use an empty linestyle:
plt.errorbar(x, y, yerr=.1, fmt=None, color='b', linestyle='')
This works for me in matplotlib version 3.3.3