假设我有两个numpy数组x
和y
,我想绘制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))
但我对一般解决方案感兴趣。
答案 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()
导致
请注意,第一个标签不好;当你运行代码时,会发出零警告。这是因为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()
对于更通用的解决方案,您需要指定要将滴答作为的x_values
x
通常会有比你想要的更多的积分。可以手动指定,也可以调用ax.get_xticklabels()
让matplotlib
返回自动滴答点。
对于最常用的方法,您只需告诉matplotlib您希望如何格式化标记,然后查看Jake Vanderplas tutorial或example in the docs的格式化程序部分。