Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Matplotlib logarithmic scatter plot (http://www.velocityreviews.com/forums/t354904-matplotlib-logarithmic-scatter-plot.html)

 Derek Basch 02-27-2006 08:59 PM

Matplotlib logarithmic scatter plot

Can anyone give any suggestions on how to make a logarithmic (base 10)
x and y axis (loglog) plot in matplotlib? The scatter function doesn't
seem to have any log functionality built into it.

Thanks,
Derek Basch

P.S. I suck at math so feel free to make me feel stupid if it is really
easy to do :).

 Bas 02-27-2006 09:28 PM

Re: Matplotlib logarithmic scatter plot

Try this, don't know if this works for al versions:

from pylab import *
x=10**linspace(0,5,100)
y=1/(1+x/1000)
loglog(x,y)
show()

If you only need a logarithm along one axis you can use semilogx() or
semilogy(). For more detailed questions go to the matplotlib mailing
list.

Cheers,
Bas

 Derek Basch 02-27-2006 09:59 PM

Re: Matplotlib logarithmic scatter plot

Thanks for the reply. I need a scatter plot though. Can that be done?

 John Hunter 02-27-2006 11:26 PM

Re: Matplotlib logarithmic scatter plot

>>>>> "Derek" == Derek Basch <dbasch@yahoo.com> writes:

Derek> Thanks for the reply. I need a scatter plot though. Can
Derek> that be done?

You can set the scale of xaxis and yaxis to either log or linear for
scatter plots

In [33]: ax = subplot(111)

In [34]: ax.scatter( 1e6*rand(1000), rand(1000))
Out[34]: <matplotlib.collections.RegularPolyCollection instance at
0x9c32fac>

In [35]: ax.set_xscale('log')

In [36]: ax.set_xlim(1e-6,1e6)
Out[36]: (9.9999999999999995e-07, 1000000.0)

In [37]: draw()

 Derek Basch 02-28-2006 12:14 AM

Re: Matplotlib logarithmic scatter plot

Great! That worked fine after I played with it for a bit. One last
question though. How do I label the ticks with the product of the
exponentiation? For instance:

100

10**2

Thanks for all the help,
Derek Basch

 John Hunter 02-28-2006 05:56 PM

Re: Matplotlib logarithmic scatter plot

>>>>> "Derek" == Derek Basch <dbasch@yahoo.com> writes:

Derek> Great! That worked fine after I played with it for a
Derek> bit. One last question though. How do I label the ticks
Derek> with the product of the exponentiation? For instance:

Derek> 100

Derek> 10**2

You can supply your own custom tick formatters (and locators). See

http://matplotlib.sf.net/matplotlib.ticker.html

and examples

http://matplotlib.sourceforge.net/ex...tom_ticker1.py
http://matplotlib.sourceforge.net/ex...minor_demo1.py
http://matplotlib.sourceforge.net/ex...minor_demo2.py

JDH

 Derek Basch 02-28-2006 09:36 PM

Re: Matplotlib logarithmic scatter plot

Thanks again. Here is the finished product. Maybe it will help someone
in the future:

from pylab import *

def log_10_product(x, pos):
"""The two args are the value and tick position.
Label ticks with the product of the exponentiation"""
return '%1i' % (x)

ax = subplot(111)
# Axis scale must be set prior to declaring the Formatter
# If it is not the Formatter will use the default log labels for ticks.
ax.set_xscale('log')
ax.set_yscale('log')

formatter = FuncFormatter(log_10_product)
ax.xaxis.set_major_formatter(formatter)
ax.yaxis.set_major_formatter(formatter)

ax.scatter( [3, 5, 70, 700, 900], [4, 8, 120, 160, 200], s=8, c='b',
marker='s', faceted=False)
ax.scatter( [1000, 2000, 3000, 4000, 5000], [2000, 4000, 6000, 8000,
1000], s=8, c='r', marker='s', faceted=False)

ax.set_xlim(1e-1, 1e5)
ax.set_ylim(1e-1, 1e5)
grid(True)
xlabel(r"Result", fontsize = 12)
ylabel(r"Prediction", fontsize = 12)

show()

 John Hunter 03-01-2006 07:59 PM

Re: Matplotlib logarithmic scatter plot

>>>>> "Derek" == Derek Basch <dbasch@yahoo.com> writes:

Derek> formatter = FuncFormatter(log_10_product)
Derek> ax.xaxis.set_major_formatter(formatter)
Derek> ax.yaxis.set_major_formatter(formatter)

I would caution you against using identical objects for the x and y
axis *Locators*. For the formatters, it will do no harm, but for the
locators you can get screwed up because the locator object reads the
axis data and view limits when making it's choices.

Ie, do not do this:

ax.xaxis.set_major_locator(locator)
ax.yaxis.set_major_locator(locator)

but rather do this

ax.xaxis.set_major_locator(MyLocator())
ax.yaxis.set_major_locator(Mylocator())

Thanks for the example,
JDH

 Derek Basch 03-01-2006 08:07 PM

Re: Matplotlib logarithmic scatter plot

Good tip John. Hopefully it will help someone out. Thanks again.
Derek Basch

 evander21 11-03-2010 07:30 PM

You can also keep plot() from connecting the points

In the process of trying to solve what I think is the same problem I ran across a potential more convenient and elegant solution. The following command effectively creates a loglog scatter plot:

import matplotlib.pyplot as plt

plt.loglog(x,y,marker='o',linestyle='none')

hope this helps,

evan

 All times are GMT. The time now is 01:31 AM.