【问题标题】:How to make X axis in matplotlib/pylab to NOT sort automatically the values?如何使 matplotlib/pylab 中的 X 轴不自动对值进行排序?
【发布时间】:2013-01-24 01:55:20
【问题描述】:

每当我绘图时,X 轴都会自动排序(例如,如果我输入值 3、2、4,它会自动将 X 轴从小到大排序。

我该怎么做才能使轴保持我输入值的顺序,即 3、2、4

   import pylab as pl
   data = genfromtxt('myfile.dat')
   pl.axis('auto')
   pl.plot(data[:,1], data[:,0])

我找到了一个函数 set_autoscalex_on(FALSE) 但我不确定如何使用它或者它是否是我想要的。 谢谢

【问题讨论】:

  • 这就是轴的用途......小值靠近原点,大值离原点更远。问问自己你想绘制什么?也许你想改变 x 和 y = f(x) ...
  • 你为什么要这么做?
  • 我必须绘制过去 30 天的一些数据,这会损坏图表,我会尝试在此处添加图表以便您查看
  • 你想要data[:,1]data[:,0] 两个单独的行
  • set_autoscalex_on(FALSE)设置自动调整轴范围

标签: python numpy matplotlib axis


【解决方案1】:

您可以提供一个虚拟的 x 范围,然后覆盖 xtick 标签。我同意上面的 cmets 质疑它是否是最好的解决方案,但如果没有任何上下文,这很难判断。

如果你真的想,这可能是一个选择:

fig, ax = plt.subplots(1,2, figsize=(10,4))

x = [2,4,3,6,1,7]
y = [1,2,3,4,5,6]

ax[0].plot(x, y)

ax[1].plot(np.arange(len(x)), y)
ax[1].set_xticklabels(x)

编辑:如果您使用日期,为什么不在轴上绘制实际日期(如果您确实想要轴上的 29 30 1 2 等,也许可以按月份格式化?

【讨论】:

  • 谢谢,在我想用分类 x 轴(房间名称)进行绘图的情况下,这对我很有帮助,但我想对它进行排序,使得 y 值(每个房间的展品) 将增加以使其更容易看。
  • 供其他人参考,如果您的x轴列表很长,需要显示所有元素,请参考stackoverflow.com/questions/26131822/…
  • 在我的情况下,答案中的代码不起作用,我在错误的地方得到了错误的标签。但正如@Kevin 所建议的,stackoverflow.com/questions/26131822/… 中的代码运行良好。
【解决方案2】:

也许你想设置xticks:

import pylab as pl
data = genfromtxt('myfile.dat')
pl.axis('auto')
xs = pl.arange(data.shape[0])
pl.plot(xs, data[:,0])
pl.xticks(xs, data[:,1])

工作样本:

另一种选择是使用日期时间。如果您使用日期,则可以将其用作 plot 命令的输入。

工作样本:

import random
import pylab as plt
import datetime
from matplotlib.dates import  DateFormatter, DayLocator

fig, ax = plt.subplots(2,1, figsize=(6,8))

# Sample 1: use xticks
days = [29,30,31,1,2,3,4,5]
values = [random.random() for x in days]

xs = range(len(days))

plt.axes(ax[0])
plt.plot(xs, values)
plt.xticks(xs, days)

# Sample 2: Work with dates
date_strings = ["2013-01-30",
                "2013-01-31",
                "2013-02-01",
                "2013-02-02",
                "2013-02-03"]

dates = [datetime.datetime.strptime(x, "%Y-%m-%d") for x in date_strings]
values = [random.random() for x in dates]

plt.axes(ax[1])
plt.plot(dates,values)
ax[1].xaxis.set_major_formatter(DateFormatter("%b %d"))
ax[1].xaxis.set_major_locator(DayLocator())
plt.show()

【讨论】:

  • 我会试试这段代码并回复你。 (虽然我不明白)谢谢
  • 我很乐意帮助您理解它。
  • 哇,非常感谢。有效。虽然现在我在 X 轴上遇到了一点问题,但它太拥挤了 :)。如您所见imgur.com/AD1vbbO 如果您对搜索内容有任何建议,例如函数名称,我们将不胜感激。
  • 或者增加图表的大小以适应所有日期,有人知道吗?
  • 没关系,我刚找到这种方式 fig = pl.gcf() fig.set_size_inches(18.5,10.5) fig.savefig('test2png.png',dpi=100)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2019-01-27
  • 2022-01-17
  • 2010-10-08
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多