【问题标题】:How do I force graph axes to be integers? [duplicate]如何强制图形轴为整数? [复制]
【发布时间】:2020-02-24 22:31:10
【问题描述】:

我有以下代码:

import matplotlib
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.ticker import MaxNLocator
import math


filename = "populations.txt"

data = np.loadtxt(filename, usecols = 0)
year = data

data = np.loadtxt(filename, usecols = 1)
hares = data

data = np.loadtxt(filename, usecols = 2)
lynxes = data

data = np.loadtxt(filename, usecols = 3)
carrots = data

fig, axes = plt.subplots(nrows=3, figsize=(10,6))

axes[0].plot(year,hares)
axes[0].set_ylim([0,80000])

axes[1].plot(year,lynxes)
axes[1].set_ylim([0,80000])

axes[2].plot(year,carrots)
axes[2].set_ylim([0,80000])

axes[0].xaxis.set_major_locator(MaxNLocator(integer=True))

人口.txt

# year  hare    lynx    carrot
1900    30e3    4e3 48300
1901    47.2e3  6.1e3   48200
1902    70.2e3  9.8e3   41500
1903    77.4e3  35.2e3  38200
1904    36.3e3  59.4e3  40600
1905    20.6e3  41.7e3  39800
1906    18.1e3  19e3    38600
1907    21.4e3  13e3    42300
1908    22e3    8.3e3   44500
1909    25.4e3  9.1e3   42100
1910    27.1e3  7.4e3   46000
1911    40.3e3  8e3 46800
1912    57e3    12.3e3  43800
1913    76.6e3  19.5e3  40900
1914    52.3e3  45.7e3  39400
1915    19.5e3  51.1e3  39000
1916    11.2e3  29.7e3  36700
1917    7.6e3   15.8e3  41800
1918    14.6e3  9.7e3   43300
1919    16.2e3  10.1e3  41300
1920    24.7e3  8.6e3   47300

Plot results

如何强制 x 轴上的年份标签为 1900 到 1920 之间的整数(相应地保存在“年份”数组中),为什么它们首先显示为浮点数?

我试图在轴[0] 情节中强加此事,但这似乎只是引起了其他问题。我错过了什么?

理想情况下,我也希望不必将 1900 - 1920 年作为年份跨度进行硬编码,因为数据集可能会增长。我如何确保 np.loadtxt() 从一开始就将数据保存为整数,以便从一开始就不会出现这个整数/浮点标签问题? 不幸的是,dtype = np.int 没有改变任何东西。

谢谢!

【问题讨论】:

  • 感谢您的建议!不幸的是dtype=np.int 没有改变轴标签。 set_xticks 运行良好,但是如果人口数据集包含更多年份,它们不会随之改变。我不想硬编码年份跨度。 dtype=np.int 听起来更像我需要的,但它似乎没有任何效果。
  • 这是个好主意,但是:'numpy.float64' 对象不能被解释为整数。我从中得出的结论是,需要排序的问题是如何防止数组首先变成浮点数组,特别是考虑到数据都是整数。也许还有另一种加载文本文件数据的方法,它不默认为浮动?
  • 好吧,阅读年份时同时使用dtype=np.int,以及ax.set_xticks(range(min(year), max(year)+1, 2)ax.set_xticks(range(int(min(year)), int(max(year))+1, 2)
  • 瞧!你是我的英雄

标签: python matplotlib plot integer axes


【解决方案1】:

欢迎来到 Stackoverflow。

如果您手动指定输入,您可以通过导入数学模块或仅使用 range 来完成此操作。

import math
y_vals = range(math.floor(min(0)), math.ceil(max(80000))+1)

在设置yticks 时添加y_vals。我在此处添加了数学函数,以防您处理未手动输入的其他值,并且我过去曾引用过 this answer。你也可以很容易地改用range(0, 80001),它会起作用。

那就是:

axes[0].set_yticks(y_vals)

对所有轴都这样做。

【讨论】:

  • 谢谢!使用您的建议,我收到以下错误:'int' object is not iterable。当我删除数学函数并且只是这样做时:x_vals = range(1900, 1921, 2) axes[0].set_xticks(x_vals) 它给了我正是我所需要的。我非常感谢您的帮助,谢谢! :)
  • 虽然 - 该解决方案确实需要我在年份跨度内进行硬编码,因此如果数据集增长到包含更多年份,它将无法工作......理想情况下,我当时可以强制使用 int 数组np.loadtxt() 被调用。必须有某种方法来做到这一点。虽然 dtype=np.int 似乎不起作用
【解决方案2】:

JohanC in the comments解决:

好吧,阅读年份时同时使用dtype=np.int,以及ax.set_xticks(range(min(year), max(year)+1, 2)ax.set_xticks(range(int(min(year)), int(max(year))+1, 2)

【讨论】:

  • 感谢 Bhargav 的格式化
猜你喜欢
  • 1970-01-01
  • 2012-08-16
  • 2015-04-29
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
  • 2021-07-22
相关资源
最近更新 更多