I want to make some modifications to a few selected tick labels in a plot.
For example, if I do:
label = axes.yaxis.get_major_ticks()[2].label
label.set_fontsize(size)
label.set_rotation('vertical')
the font size and the orientation of the tick label is changed.
However, if try:
label.set_text('Foo')
the tick label is not modified. Also if I do:
print label.get_text()
nothing is printed.
Here's some more strangeness. When I tried this:
from pylab import *
axes = figure().add_subplot(111)
t = arange(0.0, 2.0, 0.01)
s = sin(2*pi*t)
axes.plot(t, s)
for ticklabel in axes.get_xticklabels():
print ticklabel.get_text()
Only empty strings are printed, but the plot contains ticks labeled as '0.0', '0.5', '1.0', '1.5', and '2.0'.
Caveat: Unless the ticklabels are already set to a string (as is usually the case in e.g. a boxplot), this will not work with any version of matplotlib newer than
1.1.0
. If you're working from the current github master, this won't work. I'm not sure what the problem is yet... It may be an unintended change, or it may not be...Normally, you'd do something along these lines:
To understand the reason why you need to jump through so many hoops, you need to understand a bit more about how matplotlib is structured.
Matplotlib deliberately avoids doing "static" positioning of ticks, etc, unless it's explicitly told to. The assumption is that you'll want to interact with the plot, and so the bounds of the plot, ticks, ticklabels, etc will be dynamically changing.
Therefore, you can't just set the text of a given tick label. By default, it's re-set by the axis's Locator and Formatter every time the plot is drawn.
However, if the Locators and Formatters are set to be static (
FixedLocator
andFixedFormatter
, respectively), then the tick labels stay the same.This is what
set_*ticklabels
orax.*axis.set_ticklabels
does.Hopefully that makes it slighly more clear as to why changing an individual tick label is a bit convoluted.
Often, what you actually want to do is just annotate a certain position. In that case, look into
annotate
, instead.This works:
In newer versions of
matplotlib
, if you do not set the tick labels with a bunch ofstr
values, they are''
by default (and when the plot is draw the labels are simply the ticks values). Knowing that, to get your desired output would require something like this:and the result:
and now if you check the
_xticklabels
, they are no longer a bunch of''
.It works in the versions from
1.1.1rc1
to the current version2.0
.It's been a while since this question was asked. As of today (
matplotlib 2.2.2
) and after some reading and trials, I think the best/proper way is the following:Matplotlib has a module named
ticker
that "contains classes to support completely configurable tick locating and formatting". To modify a specific tick from the plot, the following works for me:Caveat!
x
is the value of the tick andpos
is its relative position in order in the axis. Notice thatpos
takes values starting in1
, not in0
as usual when indexing.In my case, I was trying to format the
y-axis
of a histogram with percentage values.mticker
has another class namedPercentFormatter
that can do this easily without the need to define a separate function as before:In this case
xmax
is the data value that corresponds to 100%. Percentages are computed asx / xmax * 100
, that's why we fixxmax=1.0
. Also,decimals
is the number of decimal places to place after the point.One can also do this with pylab and xticks
http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html
The axes class has a set_yticklabels function which allows you to set the tick labels, like so:
I'm still working on why your example above didn't work.