强制matplotlib仅显示Y轴上从0开始的正数

时间:2014-12-15 05:35:37

标签: python matplotlib visualization

在循环中,我使用Matplotlib创建了一些子图。

我注意到在某些情况下,Y轴(特别是在显示0时)在Y轴上显示一些负数。

是否有参数强制Y轴显示正数(即从0开始。

一个参数,使Y轴值为一位或无小数位。 (显示2而不是2.0或2.00(它似乎根据数据自动执行)。

for a in account_list:
    f = plt.figure()
    f.set_figheight(20)
    f.set_figwidth(20)
    f.sharex = True
    f.sharey=True

    left  = 0.125  # the left side of the subplots of the figure
    right = 0.9    # the right side of the subplots of the figure
    bottom = 0.1   # the bottom of the subplots of the figure
    top = 0.9      # the top of the subplots of the figure
    wspace = 0.2   # the amount of width reserved for blank space between subplots
    hspace = .8  # the amount of height reserved for white space between subplots
    subplots_adjust(left=left, right=right, bottom=bottom, top=top, wspace=wspace, hspace=hspace)

    count = 1
    for h in headings:
        sorted_data[sorted_data.account == a].ix[0:,['month_date',h]].plot(ax=f.add_subplot(7,3,count),legend=True,subplots=True,x='month_date',y=h)

        import matplotlib.patches as mpatches
        legend_name = mpatches.Patch(color='none', label=h)
        plt.xlabel("")
        ppl.legend(handles=[legend_name],bbox_to_anchor=(0.,1.2,1.0,.10), loc="center",ncol=2, mode="expand", borderaxespad=0.)
        count = count + 1

enter image description here

修改

当我使用以下设置Y轴的最小值和最大值时:我最终得到重复的数字。例如,曾经在Y轴上绘制的图:1,1.5,2,2.5现在它只有1,1,2,2,3,3(我希望每个数字只出现一次。

也许这与我的if语句不起作用有关。我希望所有Y轴最大值小于10的图都将其最大Y值设置为10。

#set bottom Y axis limit to 0 and change number format to 1 dec place.
    axis_data = f.gca()

    from matplotlib.ticker import FormatStrFormatter
    axis_data.yaxis.set_major_formatter(FormatStrFormatter('%.0f'))

    #set only integers on Y axis >>>
    import matplotlib.ticker as ticker
    axis_data.xaxis.set_major_locator(ticker.MaxNLocator(integer=True))

    #if y max < 10 make it ten
    ymin,ymax = axis_data.get_ylim()
    print(type(ymax))

    if ymax <10:
        axis_data.set_ylim(bottom=0.,top=ymax)
    else:
        axis_data.set_ylim(bottom=0.)

enter image description here

3 个答案:

答案 0 :(得分:2)

ax.set_ylim是更改子图的y轴限制的方法。要使用此功能,您必须拥有Axes实例(由plt.subplot返回的实例);然后你可以将下限设置为0.沿着这些行的东西应该有效:

ax = plt.subplot(1, 1, 1)
ax.plot(x, y)
ax.set_ylim(bottom=0.)
plt.show()

要更改刻度标签格式,一种方便的方法是使用FormatStrFormatter

from matplotlib.ticker import FormatStrFormatter
ax.yaxis.set_major_formatter(FormatStrFormatter('%.1f'))

修改: 我看过你的代码;您可以使用fig.gca()方法获取Axes实例,然后如上所述设置ylim和major_formatter。

<强> EDIT2 : 问题在于它可以通过指定ticks locator来解决注释。默认情况下使用的定位器为AutoLocator,基本上是MaxNLocator的默认值。 MaxNLocator采用的关键字之一是整数,它仅指定刻度的整数值,默认为False。因此,要使得刻度仅采用整数值,您需要使用MaxNLocator为y轴integer=True定义。这应该有效:

from matplotlib.ticker import MaxNLocator
ax.yaxis.set_major_locator(MaxNLocator(integer=True))

<强> EDIT3

如果您想将最高y限制设置为10,则应明确将其设置为10:

if ymax < 10:
    axis_data.set_ylim(bottom=0., top=10.)
else:
    axis_data.set_ylim(bottom=0.)

答案 1 :(得分:1)

轴范围可以被xlim()ylim()限制在特定范围内,例如

ylim([0,2])

可以使用xticks()yticks()手动将轴刻度设置为任何字符串,例如

yticks([0,1,2],["0","1","2"])

答案 2 :(得分:1)

不幸的是,有许多方法可以调整滴答声。所以它有时会变得一团糟。

尝试:

tickpos = [1,2,5]

py.axis(ymin = 0)
py.yticks(tickpos,tickpos)

如果你不在两个参数中使用tickpos并使用两个不同的数组,则第一个数组表示滴答的位置。第二个说明标签是什么。如果你想让标签成为一个字符串(比如说它是一个条形图,你希望标签是给定条形的类别),这很有用。如果您将它们作为数字,这是非常危险的,因为您可能会发现您移动了刻度位置,而不是标签。因此,您将位置y = 4标记为,例如,6。以下将是BAD

py.yticks([1,2,3], [1, 4, -1])  #DO NOT DO THIS

您也可以设置     py.axis(ymin = 0,ymax = 4,xmin = 3) 或其他变体取决于您希望py可以自由设置的限制。作为注释,如果我想确定y = 4处的刻度出现,有时我会设置ymax = 4.000001。