将x的函数作为x刻度标签

时间:2014-06-05 08:18:15

标签: python matplotlib

假设我有两个numpy数组xy,我想绘制y的简单曲线作为x的函数。在y轴上,我想(作为标签)放置y的值,但是在x轴上,我想将标签的某些函数放在那里作为标签。

例如,如果x=array([1, 2, 4, 8, 16])y=array([1, 2, 1, 2, 1]),我想为xticks分配标签,这将是以下字符串格式化的结果:

lambda x_val: "$2^{{+{:.0f}}}$".format(log2(x_val))

但我对一般解决方案感兴趣。

2 个答案:

答案 0 :(得分:3)

使用matplotlib.ticker.FuncFormatter。无耻地复制和调整custom ticker示例,这样的事情可以起作用:

from matplotlib.ticker import FuncFormatter
import matplotlib.pyplot as plt
from matplotlib import rc
import numpy as np

rc('text', usetex=True)

formatter = FuncFormatter(lambda x_val, tick_pos: "$2^{{+{:.0f}}}$".format(np.log2(x_val)))

x = np.array([1, 2, 4, 8, 16])
y = np.array([1, 2, 1, 2, 1])
fig, ax = plt.subplots()
ax.xaxis.set_major_formatter(formatter)
plt.plot(x, y)
plt.show()

导致

enter image description here

请注意,第一个标签不好;当你运行代码时,会发出零警告。这是因为matplotlib将轴缩放在0到16之间,并将刻度线标记为0(然后传递给格式化程序)。您可以关闭该刻度线,或者以不同方式缩放x轴以避免这种情况。

答案 1 :(得分:0)

对于您提供的案例:

import matplotlib.pylab as plt
import numpy as np

x = np.array([1, 2, 4, 8, 16]) 
y = np.array([1, 2, 1, 2, 1])

ax = plt.subplot()
ax.plot(x, y)

ax.set_xticks(x)
ax.set_xticklabels(["$2^{{+{:.0f}}}$".format(np.log2(x_val)) for x_val in x])

plt.show()

enter image description here

对于更通用的解决方案,您需要指定要将滴答作为的x_values x通常会有比你想要的更多的积分。可以手动指定,也可以调用ax.get_xticklabels()matplotlib返回自动滴答点。

对于最常用的方法,您只需告诉matplotlib您希望如何格式化标记,然后查看Jake Vanderplas tutorialexample in the docs的格式化程序部分。