Daniel
Daniel

Reputation: 12076

Independent spacing for ticks and ticklabels?

I want to have a scatter plot with ticks as marginals:

x = [ 0,  1, 1.2, 1.3, 4, 5, 6, 7, 8.2, 9, 10]
y = [.2, .4, 2, 3, 4, 5, 5.1, 5.2, 4, 3, 8]

fig, ax1 = plt.subplots()
for spine in ax1.spines.values():
    spine.set_visible(False)

ax1.scatter(x, y)

ax1.set_xticks(x)
ax1.set_xticklabels([])

ax1.set_yticks(y)
ax1.set_yticklabels([])

ticks as marginals

And on top of that, I want to have ticklabels at other positions, not determined by the ticks:

xticklabels = [0, 5, 10]
yticklabels = xticklabels

How could I possibly achieve that?

Upvotes: 2

Views: 199

Answers (1)

ImportanceOfBeingErnest
ImportanceOfBeingErnest

Reputation: 339775

Matplotlib axes have major and minor ticks. You may use the minor ticks to show the marginal locations of the points. You may turn the major ticks off but show the ticklabels for them.

To set ticks at certain positions you can use a FixedLocator. To change the appearance of the ticks or turn them off, the axes has a tick_params method.

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

x = [ 0,  1, 1.2, 1.3, 4, 5, 6, 7, 8.2, 9, 10]
y = [.2, .4, 2, 3, 4, 5, 5.1, 5.2, 4, 3, 8]

xticklabels = [0, 5, 10]
yticklabels = xticklabels

fig, ax = plt.subplots()
for spine in ax.spines.values():
    spine.set_visible(False)

ax.scatter(x, y)

ax.xaxis.set_major_locator(ticker.FixedLocator(xticklabels))
ax.yaxis.set_major_locator(ticker.FixedLocator(yticklabels))

ax.xaxis.set_minor_locator(ticker.FixedLocator(x))
ax.yaxis.set_minor_locator(ticker.FixedLocator(y))

ax.tick_params(axis="both", which="major", bottom="off", left="off")
ax.tick_params(axis="both", which="minor", length=4)

plt.show()

enter image description here

Note that I personally find this plot rather difficult to grasp and if I may, I would propose something more like this:

enter image description here

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

x = [ 0,  1, 1.2, 1.3, 4, 5, 6, 7, 8.2, 9, 10]
y = [.2, .4, 2, 3, 4, 5, 5.1, 5.2, 4, 3, 8]

xticklabels = [0, 5, 10]
yticklabels = xticklabels

fig, ax = plt.subplots()

ax.scatter(x, y)

ax.xaxis.set_minor_locator(ticker.FixedLocator(x))
ax.yaxis.set_minor_locator(ticker.FixedLocator(y))

c = "#aaaaaa"
ax.tick_params(axis="both", which="major", direction="out", color=c)
ax.tick_params(axis="both", which="minor", length=6, direction="in",
           color="C0", width=1.5)
plt.setp(ax.spines.values(), color=c)
plt.setp(ax.get_xticklabels(), color=c)
plt.setp(ax.get_yticklabels(), color=c)

plt.show()

Upvotes: 1

Related Questions