Начиная с здесь это довольно просто, для доступа к объекту осей и изменения spines
, вам просто нужно сначала выставить объект Axes
с помощью метода plt.gca()
.
Недостатком здесь является то, что получить xticklabels, как вы их поместили, немного сложнее, но это всего лишь случай размещения соответствующего текста на Axes
с последующим повторением этого для xlabel
. Вы всегда можете попробовать использовать аргумент labelpad
для plt.xlabel()
, но я не особо с этим справляюсь.
import matplotlib.pyplot as plt
plt.rcdefaults()
import numpy as np
import matplotlib.pyplot as plt
objects = ('Python', 'C++', 'Java', 'Perl', 'Scala', 'Lisp')
y_pos = np.arange(len(objects))
performance = [10,8,6,-4,2,1]
plt.bar(y_pos, performance, align='center', alpha=0.5)
# Get the axes object
ax = plt.gca()
# remove the existing ticklabels
ax.set_xticklabels([])
# remove the extra tick on the negative bar
ax.set_xticks([idx for (idx, x) in enumerate(performance) if x > 0])
ax.spines["bottom"].set_position(("data", 0))
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
# placing each of the x-axis labels individually
label_offset = 0.5
for language, (x_position, y_position) in zip(objects, enumerate(performance)):
if y_position > 0:
label_y = -label_offset
else:
label_y = y_position - label_offset
ax.text(x_position, label_y, language, ha="center", va="top")
# Placing the x-axis label, note the transformation into `Axes` co-ordinates
# previously data co-ordinates for the x ticklabels
ax.text(0.5, -0.05, "Usage", ha="center", va="top", transform=ax.transAxes)
plt.show()
Результат: