custom axes tickmarks projection plot
Hello All, Does know how to specify custom tickmark locations for the y axis of a projection plot in the 3.2 release? I was able to do it in 3.1 using the following code: p = yt.ProjectionPlot(ds,2,string,center=[cent,height,0],width=(wide,height),origin="native",data_source=cut,method='integrate',weight_field='temperature') ax = p.plots[string].axes ax.yaxis.set_ticks([0.00, 0.15, 0.30]) This would place tickmarks and their labels on the y axis at 0, 0.15, and 0.3. When I try and do this using yt 3.2 I get the following error: AttributeError Traceback (most recent call last)<ipython-input-76-6e901a613181> in <module>() 16 ax = p.plots[string].axes---> 17 ax.yaxis.set_ticks([0.00, 0.15, 0.30]) AttributeError: 'NoneType' object has no attribute 'yaxis' It appears that we can no longer manipulate the axes object like we were able to in 3.1. Thank you!
On Mon, Aug 10, 2015 at 1:33 PM, Gabriel Goodwin <ggoodwin52@gmail.com> wrote:
Hello All,
Does know how to specify custom tickmark locations for the y axis of a projection plot in the 3.2 release? I was able to do it in 3.1 using the following code:
p = yt.ProjectionPlot(ds,2,string,center=[cent,height,0],width=(wide,height),origin="native",data_source=cut,method='integrate',weight_field='temperature') ax = p.plots[string].axes ax.yaxis.set_ticks([0.00, 0.15, 0.30])
This would place tickmarks and their labels on the y axis at 0, 0.15, and 0.3.
When I try and do this using yt 3.2 I get the following error:
AttributeError Traceback (most recent call last)<ipython-input-76-6e901a613181> in <module>() 16 ax = p.plots[string].axes---> 17 ax.yaxis.set_ticks([0.00, 0.15, 0.30]) AttributeError: 'NoneType' object has no attribute 'yaxis'
This is due to a performance improvement that was merged in after 3.1 went out. See: https://bitbucket.org/yt_analysis/yt/pull-requests/1481/plot-window-performa... The quick fix is to call "p._setup_plots()" before manipulating the axes object. The error you're seeing is because we don't actually call out to matplotlib anymore until just before the plots need to be created to be saved to disk or displayed to a user. You're definitely not doing anything crazy and the way it works now is definitely a bit nonintuitive if you're used to the plots being valid immediately after calling ProjectionPlot. One thing I could see doing is to make sure the plot is created if a user *does* actually try to access the axes object. This could be done by making the "axes" attribute a property that returns the axes if it's been created already or creates the axes if it hasn't yet been created and then returns them. That would take a little bit of coding work to get functional. Please feel free to file an issue about this or take a stab at implementing it yourself. I can't guarantee that I'll be able to work on this myself on a short timescale, but filing the issue will prevent us from forgetting about it. -Nathan
It appears that we can no longer manipulate the axes object like we were able to in 3.1.
Thank you!
_______________________________________________ yt-users mailing list yt-users@lists.spacepope.org http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
Hi Nathan, I gave that a try. It does put the tickmarks where I want them. However, I have to specify the tickmark locations at the end of my projection plot customization block of code, as shown below, otherwise it has no effect and the tickmark locations stay default. Calling the function p._setup_plots() at the end of the code block negates all the prior customizations I made to the plot, so unfortunately the quick fix doesn't work in this case. I will file an issue on bitbucket. Here is my plotting code with your quick fix: p = yt.ProjectionPlot(ds,2,string,center=[cent,height,0],width=(wide,height),origin="native",data_source=cut,method='integrate',weight_field='temperature')#,data_source=cut p.set_log(string,False) p.set_minorticks(string,'off') p.set_zlim(string,300,6000) #1E-3,10 p.set_colorbar_label(string, 'Temperature [K]') #'Temperature [K]') p.set_cbar_minorticks(string,'off') p.set_cmap(field=string, cmap=mymap) #cmap='kamae_r') #'gray_r') p.set_buff_size((12000,2696)) #6000,1348 p.set_figure_size('12') #12 p.set_font({'size':12}) p.annotate_timestamp(x_pos=cent-0.55*wide+0.084,y_pos=0.0075,time_format="{time:.4} {units}",draw_inset_box=True,coord_system='plot', text_args={'color':'black','weight':'normal','size':10},inset_box_args={'boxstyle': 'square,pad=0.2', 'fc':'white','ec': 'black','alpha': 1.0}) p._setup_plots() ax = p.plots[string].axes ax.yaxis.set_ticks([0.00, 0.15, 0.30])# ([0.00, 0.15, 0.30]) Rearranging the code like this gives me the plot I want, but the tickmark locations stay default: p = yt.ProjectionPlot(ds,2,string,center=[cent,height,0],width=(wide,height),origin="native",data_source=cut,method='integrate',weight_field='temperature')#,data_source=cut p._setup_plots() ax = p.plots[string].axes ax.yaxis.set_ticks([0.00, 0.15, 0.30])# ([0.00, 0.15, 0.30]) p.set_log(string,False) p.set_minorticks(string,'off') p.set_zlim(string,300,6000) #1E-3,10 p.set_colorbar_label(string, 'Temperature [K]') #'Temperature [K]') p.set_cbar_minorticks(string,'off') p.set_cmap(field=string, cmap=mymap) #cmap='kamae_r') #'gray_r') p.set_buff_size((12000,2696)) #6000,1348 p.set_figure_size('12') #12 p.set_font({'size':12}) p.annotate_timestamp(x_pos=cent-0.55*wide+0.084,y_pos=0.0075,time_format="{time:.4} {units}",draw_inset_box=True,coord_system='plot', text_args={'color':'black','weight':'normal','size':10},inset_box_args={'boxstyle': 'square,pad=0.2', 'fc':'white','ec': 'black','alpha': 1.0}) Doing it this way, I get the same error as in my original email: p = yt.ProjectionPlot(ds,2,string,center=[cent,height,0],width=(wide,height),origin="native",data_source=cut,method='integrate',weight_field='temperature')#,data_source=cut p._setup_plots() p.set_log(string,False) p.set_minorticks(string,'off') p.set_zlim(string,300,6000) #1E-3,10 p.set_colorbar_label(string, 'Temperature [K]') #'Temperature [K]') p.set_cbar_minorticks(string,'off') p.set_cmap(field=string, cmap=mymap) #cmap='kamae_r') #'gray_r') p.set_buff_size((12000,2696)) #6000,1348 p.set_figure_size('12') #12 p.set_font({'size':12}) p.annotate_timestamp(x_pos=cent-0.55*wide+0.084,y_pos=0.0075,time_format="{time:.4} {units}",draw_inset_box=True,coord_system='plot', text_args={'color':'black','weight':'normal','size':10},inset_box_args={'boxstyle': 'square,pad=0.2', 'fc':'white','ec': 'black','alpha': 1.0}) ax = p.plots[string].axes ax.yaxis.set_ticks([0.00, 0.15, 0.30])# ([0.00, 0.15, 0.30]) On Mon, Aug 10, 2015 at 2:49 PM, Nathan Goldbaum <nathan12343@gmail.com> wrote:
On Mon, Aug 10, 2015 at 1:33 PM, Gabriel Goodwin <ggoodwin52@gmail.com> wrote:
Hello All,
Does know how to specify custom tickmark locations for the y axis of a projection plot in the 3.2 release? I was able to do it in 3.1 using the following code:
p = yt.ProjectionPlot(ds,2,string,center=[cent,height,0],width=(wide,height),origin="native",data_source=cut,method='integrate',weight_field='temperature') ax = p.plots[string].axes ax.yaxis.set_ticks([0.00, 0.15, 0.30])
This would place tickmarks and their labels on the y axis at 0, 0.15, and 0.3.
When I try and do this using yt 3.2 I get the following error:
AttributeError Traceback (most recent call last)<ipython-input-76-6e901a613181> in <module>() 16 ax = p.plots[string].axes---> 17 ax.yaxis.set_ticks([0.00, 0.15, 0.30]) AttributeError: 'NoneType' object has no attribute 'yaxis'
This is due to a performance improvement that was merged in after 3.1 went out. See: https://bitbucket.org/yt_analysis/yt/pull-requests/1481/plot-window-performa...
The quick fix is to call "p._setup_plots()" before manipulating the axes object. The error you're seeing is because we don't actually call out to matplotlib anymore until just before the plots need to be created to be saved to disk or displayed to a user.
You're definitely not doing anything crazy and the way it works now is definitely a bit nonintuitive if you're used to the plots being valid immediately after calling ProjectionPlot.
One thing I could see doing is to make sure the plot is created if a user *does* actually try to access the axes object. This could be done by making the "axes" attribute a property that returns the axes if it's been created already or creates the axes if it hasn't yet been created and then returns them. That would take a little bit of coding work to get functional.
Please feel free to file an issue about this or take a stab at implementing it yourself. I can't guarantee that I'll be able to work on this myself on a short timescale, but filing the issue will prevent us from forgetting about it.
-Nathan
It appears that we can no longer manipulate the axes object like we were able to in 3.1.
Thank you!
_______________________________________________ yt-users mailing list yt-users@lists.spacepope.org http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
_______________________________________________ yt-users mailing list yt-users@lists.spacepope.org http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
participants (2)
-
Gabriel Goodwin
-
Nathan Goldbaum