I found out in this helpful answer that plt.scatter()
and plt.plot()
behave differently when a logrithmic scale is used on the y axis.
With plot
, I can change to log any time before I use plt.show()
, but log has to be set up-front, before the scatter method is used.
Is this just a historical and irreversible artifact in matplotlib, or is this in the 'unexpected behavior' category?
import matplotlib.pyplot as plt X = [0.997, 2.643, 0.354, 0.075, 1.0, 0.03, 2.39, 0.364, 0.221, 0.437] Y = [15.487507, 2.320735, 0.085742, 0.303032, 1.0, 0.025435, 4.436435, 0.025435, 0.000503, 2.320735] plt.figure() plt.subplot(2,2,1) plt.scatter(X, Y) plt.xscale('log') plt.yscale('log') plt.title('scatter - scale last') plt.subplot(2,2,2) plt.plot(X, Y) plt.xscale('log') plt.yscale('log') plt.title('plot - scale last') plt.subplot(2,2,3) plt.xscale('log') plt.yscale('log') plt.scatter(X, Y) plt.title('scatter - scale first') plt.subplot(2,2,4) plt.xscale('log') plt.yscale('log') plt.plot(X, Y) plt.title('plot - scale first') plt.show()
The logarithmic scale is useful for plotting data that includes very small numbers and very large numbers because the scale plots the data so you can see all the numbers easily, without the small numbers squeezed too closely.
Add the text *s* to the axes at location *x*, *y* in data coordinates, using plt. text() method, where the font size can be customized by changing the font-size value. Using xticks method, get or set the current tick locations and labels of the X-axis. To show the figure, use plt.
MatPlotLib with PythonPlot − Plot helps to plot just one diagram with (x, y) coordinates. Axes − Axes help to plot one or more diagrams in the same window and sets the location of the figure.
Using plt. show() in Matplotlib mode is not required.
This somehow has to do with the the display area (axes limits) calculated by matplotlib
.
This behaviour is fixed by manually editing the axes range by using set_xlim
and set_ylim
methods.
plt.figure() plt.scatter(X, Y) plt.yscale('log') plt.xscale('log') axes = plt.gca() axes.set_xlim([min(X),max(X)]) axes.set_ylim([min(Y),max(Y)]) plt.show()
The exact reason of this behavior is however not yet figured out by me. Suggestions are welcomed.
EDIT
As mentioned in comments section, apparently Matplotlib has identified Autoscaling has fundamental problems as a Release Critical Issue on their official Github repo, which would be fixed in upcoming versions. Thanks.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With