From: John H. <jdh...@ac...> - 2004-05-08 13:09:56
|
>>>>> "Steve" == Steve Chaplin <ste...@ya...> writes: Steve> John, I've just started using the new tick locating, Steve> formatting and date plotting and noticed if you want to Steve> show day of month, month and year its quite easy to end up Steve> with major and minor tick labels overwriting each other. Steve> Is there a way to draw the major tick label underneath the Steve> minor tick label so they're not competing for the same Steve> space? There are a few ways to go here. First of all, with no change to the code, you can set the tick positions of the minor tick labels as follow. I'm just winging this code so apologies if there is a minor mistake somewhere ax = subplot(111) #your plot here for tick in ax.xaxis.get_minor_ticks(): tick.label1.set_y(-0.1) Note that the y coord of the x tick label is in axes coordinates, where 0 is the bottom and 1 is the top of the axes, so -0.1 is 10% below the bottom of the axes. label1 and label2 are the bottom and top label text.Text instances (this is a recent feature to support left/right labeling or top/bottom tick labeling) so you can call any of the Text methods on them. Note this code only affects the current ticks, so if you were doing interactive navigation and zoomed out, thereby creating new minor ticks, the new minor ticks would have their default locations (but I can fix this fairly easily by updating the copy properties function that transfers old tick properties to new ones when ticks are created during interaction). There is an additional consideration. Currently, the tick drawing code will skip a minor tick if a major tick has already been drawn at that exact location. In axis.py there is a line in the axis drawing code that reads if seen.has_key(loc): continue where seen is a dict that has a key if the tick location loc was drawn by the major tick drawing code. We could add an attribute, something like forceDraw, to the tick and modify this code so that you could do if not tick.forceDraw and seen.has_key(loc): continue and in your code for tick in ax.xaxis.get_minor_ticks(): tick.forceDraw = True tick.label1.set_y(-0.1) Let me know how this works for you. We could automate this a bit if you think it's worthwhile, eg by setting a 'draw under' flag for the minor ticks, getting the bounding boxes of the major ticks in the axis drawing code, and setting the offsets automagically. This would have the dual advantages of working in the presence of changes in font size, interaction, etc. The question is whether it's sufficiently common to justify the extra work or if the manual control approach above suffices. If you want to add this feature, I can get you some additional pointers to code showing how to get the bounding box of all the major tick labels and using this to control the positioning of the minor tick labels. JDH |