Python 将x的函数作为x记号标签

Python 将x的函数作为x记号标签,python,matplotlib,Python,Matplotlib,假设我有两个numpy数组x和y,我想画一条y的简单曲线,作为x的函数。在y轴上,我想把y的值作为标签,但在x轴上,我想把一些值的函数作为标签放在那里 例如,如果x=array([1,2,4,8,16])和y=array([1,2,1,2,1]),我想将标签分配给XTICK,这将是以下字符串格式设置的结果: lambda x_val: "$2^{{+{:.0f}}}$".format(log2(x_val)) 但我对一般解决方案感兴趣。对于您给出的案例: import matplotlib.p

假设我有两个numpy数组
x
y
,我想画一条
y
的简单曲线,作为
x
的函数。在
y
轴上,我想把
y
的值作为标签,但在
x
轴上,我想把一些值的函数作为标签放在那里

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

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

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

对于您给出的案例:

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_值
x
通常会有比您想要的多得多的点数。手动指定它,或者可以调用
ax.getxticklabels()
以获取
matplotlib
以返回自动标记点


对于最常用的方法,您只需告诉matplotlib您希望如何格式化记号,然后请参阅的格式化程序部分或。

了解您给出的案例:

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_值
x
通常会有比您想要的多得多的点数。手动指定它,或者可以调用
ax.getxticklabels()
以获取
matplotlib
以返回自动标记点


对于最常用的方法,您只需告诉matplotlib您希望如何格式化记号,然后请参阅或的格式化程序部分。

使用
matplotlib.ticker.FuncFormatter
。厚颜无耻地复制和改编示例,类似的事情可能会奏效:

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轴以避免出现这种情况。

使用
matplotlib.ticker.FuncFormatter
。厚颜无耻地复制和改编示例,类似的事情可能会奏效:

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轴以避免出现这种情况。

我不确定-我的
x
数组中的1有什么问题?@Bach您是对的,它不是输入数据。是matplotlib自动缩放x轴导致的。我已经根据这个更新了我的答案。我不确定-我的
x
数组中的1应该有什么问题?@Bach你是对的,不是输入数据。是matplotlib自动缩放x轴导致的。我根据这一点更新了我的答案。使用
set_*ticklebels
通常是危险的,因为它将标签与数据坐标分离(唯一合理的用法是在条形图上放置文本标签,其中x单位无论如何都是无意义的)。使用
设置标签通常是危险的,因为它会将标签与数据坐标分离(唯一合理的用途是将文本标签放在条形图上,其中x单位是无意义的)。如果您不同意重复投票,请ping我。@tcaswell-不,我同意,谢谢…太好了。一票接近重复投票非常有用,但比我真正想要的权力多一点。如果你不同意重复投票,请打电话给我。-不,我同意,谢谢……太好了。一票接近重复的权力是非常有用的,但比我真正想要的权力多一点。