我使用数据的自动轴范围。
例如,当我在-29和+31之间使用x数据时,我会
ax = plt.gca()
xsta, xend = ax.get_xlim()
我得到-30和40,它没有恰当地描述数据范围。我希望看到轴范围四舍五入为5,即-30和35为限制。
有可能吗?或者,是否可以获得精确范围的x轴数据(-29,31),然后编写一个算法来手动更改(使用set_xlim
)?
感谢您的帮助。
答案 0 :(得分:5)
首先,让我们设置一个简单的例子:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([-29, 31], [-29, 31])
plt.show()
如果您想了解手动指定内容的数据范围,可以使用:
ax.xaxis.get_data_interval()
ax.yaxis.get_data_interval()
但是,想要更改为数据限制的简单填充是非常常见的。在这种情况下,请使用ax.margins(some_percentage)
。例如,这将填充数据范围的5%的限制:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([-29, 31], [-29, 31])
ax.margins(0.05)
plt.show()
要返回到原始场景,您可以手动设置轴限制仅使用5的倍数(但不能更改刻度等):
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([-29, 31], [-29, 31])
multiplier = 5.0
for axis, setter in [(ax.xaxis, ax.set_xlim), (ax.yaxis, ax.set_ylim)]:
vmin, vmax = axis.get_data_interval()
vmin = multiplier * np.floor(vmin / multiplier)
vmax = multiplier * np.ceil(vmax / multiplier)
setter([vmin, vmax])
plt.show()
我们也可以通过为每个轴子类化定位器来完成同样的事情:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoLocator
class MyLocator(AutoLocator):
def view_limits(self, vmin, vmax):
multiplier = 5.0
vmin = multiplier * np.floor(vmin / multiplier)
vmax = multiplier * np.ceil(vmax / multiplier)
return vmin, vmax
fig, ax = plt.subplots()
ax.plot([-29, 31], [-29, 31])
ax.xaxis.set_major_locator(MyLocator())
ax.yaxis.set_major_locator(MyLocator())
ax.autoscale()
plt.show()
答案 1 :(得分:0)
要将轴xlim设置为数据的确切范围,请将ax.xlim()
方法与内置的min()
和max()
函数结合使用:
#x could be a list like [0,3,5,6,15]
ax = plt.gca()
ax.xlim([min(x), max(x)]) # evaluates to ax.xlim([0, 15]) with example data above
答案 2 :(得分:0)
如果您知道自己想要的是5的倍数,请根据数据的x范围修改限制:
import math
import matplotlib.pyplot as pet
#your plotting here
xmin = min( <data_x> )
xmax = max( <data_x> )
ax = plt.gca()
ax.set_xlim( [5*math.floor(xmin/5.0), 5*math.ceil(xmax/5.0)] )
请注意,除法必须是浮点5.0
,因为int/int
忽略了小数部分。例如,xmax=6
中的5*math.ceil(6/5)
会返回5
,这会切断您的数据,而5*math.ceil(6/5.0)
则会返回所需的5*math.ceil(1.2) = 5*2 =10
。