Я пытаюсь разместить текст на графике matplotlib, но я хочу, чтобы текст оставался относительно позиции на графике.Как разместить текст matplotlib относительно графика
Можно видеть, что желаемое положение текста является центральным для раздела, которое оно представляет (см. Изображение).
В настоящее время у меня есть несколько значений offset
, которые я использую для этого, но если я изменю диапазон x, над которым я работаю, или функцию, эти значения больше не применяются.
Я хотел бы иметь общий способ позиционирования текста, чтобы независимо от используемой функции текст был центральным и разумным.
Под разумным расположением я подразумеваю, что между $ \ delta x $ и горизонтальной строкой должен быть пробел. И разрыв между $ \ дельта у $ должна быть равна той из $ \ Delta $ х
Выход
Код
#!/usr/bin/env python
import numpy as np
from matplotlib import pyplot as plt
import matplotlib
plt.style.use('ggplot')
matplotlib.rcParams['text.usetex'] = True
matplotlib.rcParams['text.latex.unicode'] = True
###############################################################################
def f(x):
return x**3
def tri(x1, x2, f):
"""input of two x coordinates and function, create and label a triangle to
represent finding the gradient
"""
color = "green"
lw = 3
# Plot the triangle beneath the curve
plt.plot([x1, x2], [f(x1), f(x1)], color=color, linewidth=lw)
plt.plot([x2, x2], [f(x1), f(x2)], color=color, linewidth=lw)
fontSz = 45
# TODO: I'M NOT SURE HOW TO PLACE THE FONT SO THAT IF I CHANGE THE FUNCTION
# OR FONT SIZE THE FONT IS PLACED IN THE SAME POSITION RELATIVELY
offset1 = 0.5 # < < < These!
offset2 = 0.05 # < < <
dx_x_place = ((x1) + (x2))/2
dx_y_place = f(x1) - offset1
dy_x_place = x2 + offset2
dy_y_place = (f(x1) + f(x2))/2
# annotate delta x
plt.text(
dx_x_place,
dx_y_place,
r'$\delta x$',
horizontalalignment='center',
verticalalignment='top',
fontsize=fontSz,
color='black'
)
# Annotate delta y
plt.text(
dy_x_place,
dy_y_place,
r'$\delta y$',
horizontalalignment='left',
verticalalignment='center',
fontsize=fontSz,
color='black'
)
###############################################################################
# global variables
X_DOMAIN = [-1,4]
X_DENSITY = 300
LINEWIDTH = 3
x = np.linspace(X_DOMAIN[0], X_DOMAIN[1], X_DENSITY)
y = f(x)
# Just put some axis on the graph
# http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.axvline
plt.axhline(linewidth = 1, color="grey")
plt.axvline(linewidth = 1, color="grey")
# create triangle to represent delta x,y
tri(2, 3, f)
plt.plot(x, y, linewidth=LINEWIDTH)
plt.show()
системы, которые я использую
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
Python версия, которую я использую
3.5.2 |Continuum Analytics, Inc.| (default, Jul 2 2016, 17:53:06)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
Matplotlib версия
import matplotlib
matplotlib.__version__
Out[37]: '1.5.1'