如何用分数表示x轴?

时间:2015-11-18 12:55:53

标签: python numpy matplotlib fractions

我想用分数来标记轴,以准确显示数据点的位置。例如,在下面的代码中我想标记x轴' 1/13 ,2 / 13,3 / 13 ...'

如何实现这一目标?

import numpy as np
import math 
import matplotlib.pyplot as plt

step=1./13.
x=np.arange(0,14)*step
y=np.sin(2*np.pi*x)
plt.plot(x,y,'r*')
plt.show()

2 个答案:

答案 0 :(得分:2)

您可以使用matplotlib.ticker模块执行此操作。我们需要使用

xaxis刻度设置格式化程序和定位器
ax.xaxis.set_major_locator

ax.xaxis.set_major_formatter

我们将使用MultipleLocator将滴答数放在给定的分数上(即step的每个倍数),然后使用FuncFormatter将刻度标签渲染为分数。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

step=1./13.
x=np.arange(0,14)*step
y=np.sin(2*np.pi*x)

fig,ax = plt.subplots()

ax.plot(x,y,'r*')

def fractions(x,pos):
    if np.isclose((x/step)%(1./step),0.):
        # x is an integer, so just return that
        return '{:.0f}'.format(x)
    else:
        # this returns a latex formatted fraction
        return '$\\frac{{{:2.0f}}}{{{:2.0f}}}$'.format(x/step,1./step)
        # if you don't want to use latex, you could use this commented
        # line, which formats the fraction as "1/13"
        ### return '{:2.0f}/{:2.0f}'.format(x/step,1./step)

ax.xaxis.set_major_locator(ticker.MultipleLocator(step))
ax.xaxis.set_major_formatter(ticker.FuncFormatter(fractions))

plt.show()

enter image description here

答案 1 :(得分:0)

两件事。

您需要设置刻度标签。

在这里看到一个很长的答案: https://stackoverflow.com/a/11250884/1331076

您需要将标签格式化为分数。 在这里你可以为每个标签生成一个字符串: 像这样(未经测试)

labels = []
n = 1.0
d=13.0
for i in range(0,14):
    labels.append(  str(n) + "/" + str(d) )
step = n/d