2016-10-19 3 views
0

Я пытаюсь разместить текст на графике matplotlib, но я хочу, чтобы текст оставался относительно позиции на графике.Как разместить текст matplotlib относительно графика

Можно видеть, что желаемое положение текста является центральным для раздела, которое оно представляет (см. Изображение).

В настоящее время у меня есть несколько значений offset, которые я использую для этого, но если я изменю диапазон x, над которым я работаю, или функцию, эти значения больше не применяются.

Я хотел бы иметь общий способ позиционирования текста, чтобы независимо от используемой функции текст был центральным и разумным.

Под разумным расположением я подразумеваю, что между $ \ delta x $ и горизонтальной строкой должен быть пробел. И разрыв между $ \ дельта у $ должна быть равна той из $ \ Delta $ х

Выход

enter image description here

Код

#!/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' 

ответ

1

То, что вы хотите сделать, это сохранить фиксированное смещение, а не в данных координатах, но в любой из осей координат или координат отображения (т.е. пиксели). Поскольку трансформации немного громоздки для работы, я бы порекомендовал вам посмотреть the transform documentation или the second example here. Однако я считаю, что документация, особенно функция inverted(), может быть полезна. Документы говорят: Вы можете использовать метод перевернутого(), чтобы создать преобразование, которое приведет вас от дисплея данных координат, на примере из дока:

In [1]: inv = ax.transData.inverted() 
In [2]: inv.transform((335.175, 247.)) 
Out[3]: array([ 5., 0.]) 

Это означает, что вы можете получить х -выполнение координат данных с inv.transform(10, 0), и оно должно вернуться array([xoffset_corresponding_to_10pixels, 0]). Сделайте то же самое для y-offset. Вероятно, вам придется обновлять значение смещения при каждом масштабировании, хотя ... Я знаю, что это не полный ответ, но, надеюсь, это поможет вам начать работу.

Смежные вопросы