matplotlib 将轴限制为整数刻度位置

rjee0c15  于 2023-06-06  发布在  其他
关注(0)|答案(4)|浏览(121)

我经常想做一个计数的条形图。如果计数很低,我经常得到不是整数的主要和/或次要刻度位置。我该如何预防这种情况?当数据是计数时,在1.5处打勾是没有意义的。
这是我的第一次尝试:

import pylab
pylab.figure()
ax = pylab.subplot(2, 2, 1)
pylab.bar(range(1,4), range(1,4), align='center')
major_tick_locs = ax.yaxis.get_majorticklocs()
if len(major_tick_locs) < 2 or major_tick_locs[1] - major_tick_locs[0] < 1:
    ax.yaxis.set_major_locator(pylab.MultipleLocator(1))
minor_tick_locs = ax.yaxis.get_minorticklocs()
if len(minor_tick_locs) < 2 or minor_tick_locs[1] - minor_tick_locs[0] < 1:
    ax.yaxis.set_minor_locator(pylab.MultipleLocator(1))

当计数很小时,它可以正常工作,但当它们很大时,我会得到很多很多小的滴答声:

import pylab
ax = pylab.subplot(2, 2, 2)
pylab.bar(range(1,4), range(100,400,100), align='center')
major_tick_locs = ax.yaxis.get_majorticklocs()
if len(major_tick_locs) < 2 or major_tick_locs[1] - major_tick_locs[0] < 1:
    ax.yaxis.set_major_locator(pylab.MultipleLocator(1))
minor_tick_locs = ax.yaxis.get_minorticklocs()
if len(minor_tick_locs) < 2 or minor_tick_locs[1] - minor_tick_locs[0] < 1:
    ax.yaxis.set_minor_locator(pylab.MultipleLocator(1))

我怎样才能从第一个例子中获得所需的行为,同时避免第二个例子中发生的事情?

gstyhher

gstyhher1#

你可以使用MaxNLocator方法,如下所示:

from pylab import MaxNLocator

    ya = axes.get_yaxis()
    ya.set_major_locator(MaxNLocator(integer=True))
ao218c7q

ao218c7q2#

我有一个类似的问题与直方图我绘制显示分数计数。我是这样解决的:

plt.hist(x=[Dataset being counted])

# Get your current y-ticks (loc is an array of your current y-tick elements)
loc, labels = plt.yticks()

# This sets your y-ticks to the specified range at whole number intervals
plt.yticks(np.arange(0, max(loc), step=1))
c8ib6hqw

c8ib6hqw3#

我想我可以忽略那些小问题。我将给予一下,看看它是否在所有用例中都成立:

def ticks_restrict_to_integer(axis):
    """Restrict the ticks on the given axis to be at least integer,
    that is no half ticks at 1.5 for example.
    """
    from matplotlib.ticker import MultipleLocator
    major_tick_locs = axis.get_majorticklocs()
    if len(major_tick_locs) < 2 or major_tick_locs[1] - major_tick_locs[0] < 1:
        axis.set_major_locator(MultipleLocator(1))

def _test_restrict_to_integer():
    pylab.figure()
    ax = pylab.subplot(1, 2, 1)
    pylab.bar(range(1,4), range(1,4), align='center')
    ticks_restrict_to_integer(ax.xaxis)
    ticks_restrict_to_integer(ax.yaxis)

    ax = pylab.subplot(1, 2, 2)
    pylab.bar(range(1,4), range(100,400,100), align='center')
    ticks_restrict_to_integer(ax.xaxis)
    ticks_restrict_to_integer(ax.yaxis)

_test_restrict_to_integer()
pylab.show()
i1icjdpr

i1icjdpr4#

pylab.bar(range(1,4), range(1,4), align='center')

和/或

xticks(range(1,40),range(1,40))

在我的代码中工作。只需要使用align可选参数,xticks就可以完成这项工作。

相关问题