Python 自定义标签pyplot matplotlib

Python 自定义标签pyplot matplotlib,python,matplotlib,Python,Matplotlib,下面是我在Python中运行的脚本: 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.linspa

下面是我在Python中运行的脚本:

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)

这是一个很好的绘图,x和y标签都是pi/2的倍数。但是如何让x和y标签分别读取,比如说,0,pi/2,pi,3*pi/2和2*pi,特别是文本的介绍?(比如说,将数字np.pi/2映射到文本“pi/2”应该不难,但获取文本标签基本上就是我在这里得到的。)

事实上,你差不多做到了。下面的代码基于此。和yticks的第一个输入是位置列表,而第二个输入是标签列表,可以是字符串

我还使用了Latex符号来表示π的希腊字母

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)

事实上,你就快到了。下面的代码基于此。和yticks的第一个输入是位置列表,而第二个输入是标签列表,可以是字符串

我还使用了Latex符号来表示π的希腊字母

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)

为了将@leal26的答案扩展为更灵活的内容(例如,如果我们想缩放/平移绘图),我们可以使用该模块

可以使用(和
ax.yaxis.set\u major\u locator
)和a,使用
base=pi/2
设置刻度的位置

然后,我们可以使用
ticker.FuncFormatter
设置勾号标签的格式(这次使用。我们必须考虑几种特殊情况(例如分子和/或分母中的1等)。请参见下面的
fracformat
函数

还请注意,我们必须使用原始字符串(
r
前缀)和双大括号作为LaTeX格式

这里真正的优势在于,我们可以轻松更改勾号位置、打印限制等,而无需每次手动重新定义勾号标签

最后,我还稍微更改了您的脚本,以使用
matplotlib
的面向对象方法,以便我们使用
plt.Figure
创建一个
Figure
实例,一个
Axes
实例(
ax
)使用
fig.add_子图
,然后对于其他所有内容,我们从
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
,以显示用最少的努力将其扩展到不同范围是多么容易


要将@leal26的答案扩展为更灵活的内容(例如,如果我们想缩放/平移绘图),我们可以使用该模块

可以使用(和
ax.yaxis.set\u major\u locator
)和a,使用
base=pi/2
设置刻度的位置

然后,我们可以使用
ticker.FuncFormatter
设置勾号标签的格式(这次使用。我们必须考虑几种特殊情况(例如分子和/或分母中的1等)。请参见下面的
fracformat
函数

还请注意,我们必须使用原始字符串(
r
前缀)和双大括号作为LaTeX格式

这里真正的优势在于,我们可以轻松更改勾号位置、打印限制等,而无需每次手动重新定义勾号标签

最后,我还稍微更改了您的脚本,以使用
matplotlib
的面向对象方法,以便我们使用
plt.Figure
创建一个
Figure
实例,一个
Axes
实例(
ax
)使用
fig.add_子图
,然后对于其他所有内容,我们从
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
,以显示用最少的努力将其扩展到不同范围是多么容易