Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does matplotlib require setting log scale before plt.scatter() but not plt.plot()?

Tags:

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?

enter image description here

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() 
like image 920
uhoh Avatar asked Aug 06 '16 03:08

uhoh


People also ask

What is logarithmic scale in Matplotlib?

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.

How do you change the scale on a PLT plot?

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.

What is the difference between PLT plot and ax plot?

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.

Is PLT show () necessary?

Using plt. show() in Matplotlib mode is not required.


1 Answers

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() 

Image

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.

like image 154
Divyanshu Srivastava Avatar answered Oct 12 '22 09:10

Divyanshu Srivastava