9

I'm trying to create an astronomical polar plot with a radial axis that starts from -45° on outer line and increases to 90° in the center of the plot. But I didn't find any way to reverse radial axis of the PolarAxes instance. invert_yaxis() method doesn't work at all. Also, there are some hidden methods such as ax.set_rlim() that doesn't have any docs.

Here is my current code:

fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8], polar=True)
# ax.invert_yaxis()
ax.set_theta_zero_location('N')
ax.set_ylim(-45, 90)
ax.set_yticks(np.arange(-45, 90, 15))
ax.plot(ras, decs, linestyle='', marker='.')

and my plot

Hello Human
  • 454
  • 7
  • 11
  • See the answer to this question: http://stackoverflow.com/questions/12075001/set-radial-axis-on-matplotlib-polar-plots – Craig Mar 29 '17 at 03:36

2 Answers2

6

Old question, but I finally found an easy answer. Use ax.set_rlim(bottom=90, top=-45). Note that you have to set this BEFORE calling ax.plot(), or it will not transform the plotted points accordingly.

smp55
  • 403
  • 3
  • 8
1

It's a little bit "hacky", but if you know the bounds (which it seems like you do as it corresponds to declination) you could do something like:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8], polar=True)
# ax.invert_yaxis()
ax.set_theta_zero_location('N')
ax.set_rlim(90, -45, 1)
# Note: you must set the end of arange to be slightly larger than 90 or it won't include 90
ax.set_yticks(np.arange(-45, 91, 15))
ax.set_yticklabels(ax.get_yticks()[::-1])
ax.plot([0,10,20], 90-np.array([12,13,14]), linestyle='', marker='.')
fig.show()

enter image description here

Robbie
  • 4,672
  • 1
  • 19
  • 24
  • It looks OK, but the actual axis is still the same - look at the values. So we also need to convert them too. – Hello Human Mar 29 '17 at 15:06
  • This does not answer the question, points still have to go under a coordinate change to be printed the right way. – Tobbey May 02 '18 at 06:06