2016-03-22 2 views
0

Вот скрипт, который я бегу в Python:пользовательские метки pyplot Matplotlib

import numpy as np 
import matplotlib.pyplot as plt 

t = np.linspace(0, 2*np.pi, 150) 
plt.figure() 
theGrid = np.outer(np.sin(t), np.sin(t)) 
plt.xlim(0, 2*np.pi) #forces an exact fit! 
plt.ylim(0, 2*np.pi) #ditto! 
plt.xticks(np.linspace(0, 2*np.pi, 5)) 
plt.yticks(np.linspace(0, 2*np.pi, 5)) 
plt.pcolormesh(t, t, theGrid) 

Это хороший сюжет, и оба х и у метки явно кратные пи/2. Но как бы получить ярлыки x и y для чтения, скажем, 0, pi/2, pi, 3 * pi/2 и 2 * pi, соответственно, в частности, введение текста? (Например, отображение np.pi/2 в текст «pi/2» не должно быть тяжелым, но получение текстовых меток в основном является тем, что я получаю здесь.)

+0

http://matplotlib.org/examples/ticks_and_spines/spines_demo_bounds.html –

ответ

2

Фактически, вы почти там. Следующий код был основан на этом post. Первый вход для xticks и yticks - это список мест, а второй вход - список меток, которые могут быть строками.

Я также использовал обозначение латекса, чтобы получить греческое письмо для пи.

import numpy as np 
import matplotlib.pyplot as plt 

t = np.linspace(0, 2*np.pi, 150) 
plt.figure() 
theGrid = np.outer(np.sin(t), np.sin(t)) 
plt.xlim(0, 2*np.pi) #forces an exact fit! 
plt.ylim(0, 2*np.pi) #ditto! 
plt.xticks(np.linspace(0, 2*np.pi, 5),['0','$\pi/2$','$\pi$','$3\pi/2$','$2\pi$']) 
plt.yticks(np.linspace(0, 2*np.pi, 5),['0','$\pi/2$','$\pi$','$3\pi/2$','$2\pi$']) 
plt.pcolormesh(t, t, theGrid) 
0

Чтобы продлить ответ @ leal26 в нечто более гибкое (то есть, если мы хотим, чтобы увеличить/кастрюля вокруг участка), мы можем использовать matplotlib.ticker модуль.

Местоположения клещей можно установить с помощью ax.xaxis.set_major_locatorax.yaxis.set_major_locator) с ticker.MultipleLocator, используя base = pi/2.

Мы можем использовать ticker.FuncFormatter, чтобы задать формат меток ярлыков (на этот раз с использованием ax.xaxis.set_major_formatter. Есть несколько особых случаев, которые мы должны учитывать (например, 1 в числителе и/или знаменателе и т. Д.). fracformat функция ниже.

Заметим также, что мы должны использовать сырые строки (r префикс) и двойные фигурные скобки для форматирования LaTeX.

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

Наконец, я также немного изменил свой сценарий, чтобы сделать использование объектно-ориентированного approact matplotlib «s, так что мы создаем Figure экземпляр с plt.figure, в Axes экземпляр (ax) с fig.add_subplot, а затем все остальное, мы называем соответствующие функции от ax.

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.ticker as ticker 
from fractions import Fraction 

t = np.linspace(0, 4*np.pi, 150) 

fig = plt.figure() 
ax = fig.add_subplot(111) 

theGrid = np.outer(np.sin(t), np.sin(t)) 

ax.set_xlim(0, 4*np.pi) #forces an exact fit! 
ax.set_ylim(0, 4*np.pi) #ditto! 

def fracformat(x,pos): 
    frac = Fraction(x/np.pi) 
    if frac.numerator == 0: 
     return 0 
    elif frac.numerator == frac.denominator: 
     return r"$\pi$" 
    elif frac.numerator == 1: 
     return r"$\frac{{ \pi }}{{ {:2d} }}$".format(frac.denominator) 
    elif frac.denominator == 1: 
     return r"${:2d} \pi$".format(frac.numerator) 
    else: 
     return r"$\frac{{ {:2d} \pi }}{{ {:2d} }}$".format(frac.numerator,frac.denominator) 

ax.xaxis.set_major_locator(ticker.MultipleLocator(np.pi/2.)) 
ax.yaxis.set_major_locator(ticker.MultipleLocator(np.pi/2.)) 

ax.xaxis.set_major_formatter(ticker.FuncFormatter(fracformat)) 
ax.yaxis.set_major_formatter(ticker.FuncFormatter(fracformat)) 

ax.pcolormesh(t, t, theGrid) 

plt.show() 

Я увеличил пределы графика в 4*pi, чтобы показать, как легко распространить это на различные диапазоны, с минимальными усилиями.

enter image description here

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