Добавление подписи под осью X для точечной диаграммы с использованием matplotlib
Я довольно новичок в Python и в библиотеке Matplotlib. Я создал точечный график, используя matplotlib, и теперь я хочу добавить заголовок чуть ниже оси X. Это мой код:
from matplotlib import pyplot as plt
import numpy as np
from pylab import *
file = open('distribution.txt', 'r')
txt="I need the caption to be present a little below X-axis"
x=[]
y=[]
for line in file:
new=line.rstrip()
mystring=new.split("\t")
x.append(mystring[0])
y.append(mystring[1])
fig = plt.figure()
ax1 = fig.add_axes((0.1,0.4,0.8,0.5))
ax1.set_title("This is my title")
ax1.set_xlabel('X-axis')
ax1.set_ylabel('Y-axis')
ax1.scatter(x,y, c='r')
fig.text(.05,.05,txt)
plt.xlim(0, 1.05)
plt.ylim(0, 2.5)
plt.show()
Как вы можете видеть на изображении, мой заголовок находится ниже графика рассеяния, есть ли способ поместить его точно ниже оси X? Также мой график рассеяния выглядит прямоугольным, есть ли способ сделать его квадратным, как?
7 ответов
Что-то вроде:
from matplotlib import pyplot as plt
import numpy as np
txt="I need the caption to be present a little below X-axis"
# make some synthetic data
x = np.linspace(0, 1, 512)
y = np.random.rand(512)*2.3 + .1
fig = plt.figure()
ax1 = fig.add_axes((0.1, 0.2, 0.8, 0.7))
ax1.set_title("This is my title")
ax1.set_xlabel('X-axis')
ax1.set_ylabel('Y-axis')
# make the edge colors match the facecolors
ax1.scatter(x,y, c='r', edgecolors='face')
# center text
fig.text(.5, .05, txt, ha='center')
# use OO interface
ax1.set_xlim([0, 1.05])
ax1.set_ylim([0, 2.5])
# resize the figure to match the aspect ratio of the Axes
fig.set_size_inches(7, 8, forward=True)
plt.show()
может работать. Облегчить это - это радар для mpl upstream, но мы все еще ищем кого-то, кто это сделает.
Вы можете просто использовать figtext
, Вы также можете изменить значения осей X и Y, как вы хотите.
txt="I need the caption to be present a little below X-axis"
plt.figtext(0.5, 0.01, txt, wrap=True, horizontalalignment='center', fontsize=12)
Во-первых, я чувствую себя странно, когда публикую ответ против ведущего разработчика matplotlib. Очевидно, @tacaswell знает matplotlib гораздо лучше, чем я когда-либо узнаю. Но в то же время его ответ не был достаточно динамичным для меня. Мне нужна подпись, которая всегда будет основываться на позиции xlabel
и не мог просто использовать текстовые аннотации.
Я подумал просто изменить xlabel
добавить новую строку и текст заголовка, но это не будет четко дифференцировать заголовок, и вы не сможете делать такие вещи, как изменение размера текста или курсива в середине текстовой строки.
Я решил это, используя возможности TeX от Matplotlib. Вот мое решение:
from matplotlib import pyplot as plt
from matplotlib import rc
import numpy as np
from pylab import *
rc('text', usetex=True)
file = open('distribution.txt', 'r')
txt="I need the caption to be present a little below X-axis"
x=[]
y=[]
for line in file:
new=line.rstrip()
mystring=new.split("\t")
x.append(mystring[0])
y.append(mystring[1])
fig = plt.figure()
ax1 = fig.add_axes((0.1,0.4,0.8,0.5))
ax1.set_title("This is my title")
ax1.set_xlabel(r'\begin{center}X-axis\\*\textit{\small{' + txt + r'}}\end{center}')
ax1.set_ylabel('Y-axis')
ax1.scatter(x,y, c='r')
plt.xlim(0, 1.05)
plt.ylim(0, 2.5)
plt.show()
Я сделал то же самое со случайной диаграммой рассеяния из ответа Такасвелла, и вот мой результат:
Одно предупреждение: если вы отрегулируете это, чтобы принимать входные строковые переменные, строки могут быть неправильно экранированы для использования с TeX. Выход из кода LaTeX уже описан в Переполнении стека по адресу /questions/28568051/kak-ya-mogu-izbezhat-spetsialnyih-simvolov-latex-vnutri-shablonov-django/28568063#28568063. Я использовал это напрямую, а затем мог взять произвольные xlabels и подписи.
Как упоминал @Nicky V.
plt.xlabel('''Butterfly contract traded
Note: c1-c2-c3 indicates the position: long 2 times c2 and short c1 anc c3''')
Результат:
Другое простое решение, которое я использовал, когда не мог понять, как это сделать, как было задумано... если это имеет смысл, это просто добавить несколько новых строк в xlabel plt.xlabel("xaxis label\n\n\n\ncaption") Это просто помещает заголовок на пару новых строк под осью x, что делает его похожим на заголовок, даже если он действительно является частью ярлыка xaxis
Я нашел еще один трюк, используяplt.text()
вы можете установить положение y ниже холста сюжета, и оно может работать как заголовок. Вы можете настроить размер шрифта, цвет и даже место разрыва строки, используя \n. Я использую этот метод
Вы можете просто использовать отрицательное положение для y, чтобы расширить фигуру за пределы текущего размера.
fig.text(0.5, -0.05, 'some caption', ha='center')
Координата соответствует фигуре, где 0,0 означает нижний левый конец, а 1,1 соответствует верхнему правому краю.
Пример -
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 1, 100)
y = np.random.rand(100)
plt.scatter(x, y)
fig = plt.gcf()
fig.text(0.5, -0.05, 'A scattered plot with caption', ha='center')