Solving problem is about exposing yourself to as many situations as possible like Modify tick label text and practice these strategies over and over. With time, it becomes second nature and a natural way you approach any problems in general. Big or small, always start with a plan, use other strategies mentioned here till you are confident and ready to code the solution.

In this post, my aim is to share an overview the topic about Modify tick label text, which can be followed any time. Take easy to follow this discuss.

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’.

##
Answer #1:

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:

```
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# We need to draw the canvas, otherwise the labels won't be positioned and
# won't have values yet.
fig.canvas.draw()
labels = [item.get_text() for item in ax.get_xticklabels()]
labels[1] = 'Testing'
ax.set_xticklabels(labels)
plt.show()
```

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`

and `FixedFormatter`

, respectively), then the tick labels stay the same.

This is what `set_*ticklabels`

or `ax.*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.

##
Answer #2:

One can also do this with *pylab* and *xticks*

```
import matplotlib
import matplotlib.pyplot as plt
x = [0,1,2]
y = [90,40,65]
labels = ['high', 'low', 37337]
plt.plot(x,y, 'r')
plt.xticks(x, labels, rotation='vertical')
plt.show()
```

http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html

##
Answer #3:

In newer versions of `matplotlib`

, if you do not set the tick labels with a bunch of `str`

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:

```
>>> from pylab import *
>>> axes = figure().add_subplot(111)
>>> a=axes.get_xticks().tolist()
>>> a[1]='change'
>>> axes.set_xticklabels(a)
[<matplotlib.text.Text object at 0x539aa50>, <matplotlib.text.Text object at 0x53a0c90>,
<matplotlib.text.Text object at 0x53a73d0>, <matplotlib.text.Text object at 0x53a7a50>,
<matplotlib.text.Text object at 0x53aa110>, <matplotlib.text.Text object at 0x53aa790>]
>>> plt.show()
```

and the result:

and now if you check the `_xticklabels`

, they are no longer a bunch of `''`

.

```
>>> [item.get_text() for item in axes.get_xticklabels()]
['0.0', 'change', '1.0', '1.5', '2.0']
```

It works in the versions from `1.1.1rc1`

to the current version `2.0`

.

##
Answer #4:

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:

```
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np
def update_ticks(x, pos):
if x == 0:
return 'Mean'
elif pos == 6:
return 'pos is 6'
else:
return x
data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
ax.hist(data, bins=25, edgecolor='black')
ax.xaxis.set_major_formatter(mticker.FuncFormatter(update_ticks))
plt.show()
```

**Caveat!** `x`

is the value of the tick and `pos`

is its relative position in order in the axis. Notice that `pos`

takes values starting in `1`

, not in `0`

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 named `PercentFormatter`

that can do this easily without the need to define a separate function as before:

```
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np
data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
weights = np.ones_like(data) / len(data)
ax.hist(data, bins=25, weights=weights, edgecolor='black')
ax.yaxis.set_major_formatter(mticker.PercentFormatter(xmax=1.0, decimals=1))
plt.show()
```

In this case `xmax`

is the data value that corresponds to 100%. Percentages are computed as `x / xmax * 100`

, that’s why we fix `xmax=1.0`

. Also, `decimals`

is the number of decimal places to place after the point.

##
Answer #5:

The axes class has a set_yticklabels function which allows you to set the tick labels, like so:

```
#ax is the axes instance
group_labels = ['control', 'cold treatment',
'hot treatment', 'another treatment',
'the last one']
ax.set_xticklabels(group_labels)
```

I’m still working on why your example above didn’t work.

##
Answer #6:

This works:

```
import matplotlib.pyplot as plt
fig, ax1 = plt.subplots(1,1)
x1 = [0,1,2,3]
squad = ['Fultz','Embiid','Dario','Simmons']
ax1.set_xticks(x1)
ax1.set_xticklabels(squad, minor=False, rotation=45)
```

##
Answer #7:

This also works in matplotlib 3:

```
x1 = [0,1,2,3]
squad = ['Fultz','Embiid','Dario','Simmons']
plt.xticks(x1, squad, rotation=45)
```

##
Answer #8:

If you do not work with `fig`

and `ax`

and you want to modify all labels (e.g. for normalization) you can do this:

```
labels, locations = plt.yticks()
plt.yticks(labels, labels/max(labels))
```