Python 自定义标签pyplot matplotlib
下面是我在Python中运行的脚本: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
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
,以显示用最少的努力将其扩展到不同范围是多么容易