自定义标签pyplot matplotlib

时间:2016-03-22 23:13:10

标签: 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.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”的映射应该不难,但获取文本标签基本上就是我在这里得到的。)

2 个答案:

答案 0 :(得分:4)

实际上,你几乎就在那里。以下代码基于此postxticks yticks 的第一个输入是位置列表,而第二个输入是标签列表,可以是字符串。

我还使用Latex表示法来获取pi的希腊字母。

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)

答案 1 :(得分: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格式化。

这里的真正优势在于我们可以轻松更改刻度线位置,绘图限制等,而无需每次都手动重新定义刻度标签。

最后,我还略微更改了您的脚本以使用matplotlib的面向对象的方法,以便我们使用Figure创建plt.figure个实例,{ {1}}实例(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() ,以显示将此扩展到不同范围是多么容易,只需要很少的努力。

enter image description here