【问题标题】:Plot x-axis with string array as in the same order in original array and not sort it alphabetically in matplotlib用字符串数组绘制 x 轴,与原始数组中的顺序相同,而不是在 matplotlib 中按字母顺序排序
【发布时间】:2018-07-02 22:37:40
【问题描述】:

Numpy 或 Matplotlib 正在改变我的 np.array 的顺序,它与我的情节相冲突。它导致月份出现故障,而相应的数据仍然处于相同的顺序,这导致情节看起来很奇怪:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

f = np.array([53, 56, 63, 72, 79, 86, 89, 88, 83, 74, 65, 56])
month = np.array(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"])
plt.plot(month, f)

plt.xlabel('Month')
plt.ylabel('Temperature')
plt.title('Average Monthly Temperature in Elizabeth City, NC')
plt.show()

这是我在 JupyterNotebook 中得到的输出:

【问题讨论】:

  • Matplotlib 在绘制之前按字母顺序对其进行排序
  • 哦,好吧。奇怪的是它仍然以正确的顺序使用相应的数据。
  • 对不起,我的意思是:matplotlib 通过对所有字符串进行排序,将字符串转换为 x 坐标,并返回每个字符串的位置。行的顺序不变,还是按顺序经过月份

标签: python arrays numpy matplotlib jupyter-notebook


【解决方案1】:

您需要使用MonthLocatorset_major_locator,如下所示:formatting timeseries x-axis in pandas/matplotlib

这是我的尝试:

import matplotlib.pyplot as plt
import numpy as np
import datetime
f = np.array([53, 56, 63, 72, 79, 86, 89, 88, 83, 74, 65, 56])

# New stuff:
from matplotlib.dates import MonthLocator, DateFormatter
dates = []
for month in range(1, 13):
    dates.append(datetime.datetime(year=2018, month=month, day=1))
plt.plot(dates, f)
ax = plt.gca()
ax.set_xlim([dates[0], dates[-1]])
ax.xaxis.set_major_locator(MonthLocator())
ax.xaxis.set_major_formatter(DateFormatter('%b'))

plt.xlabel('Month')
plt.ylabel('Temperature')
plt.title('Average Monthly Temperature in Elizabeth City, NC')
plt.show()

【讨论】:

  • 我在尝试用我现有的代码实现这些时遇到了麻烦
  • @EdselNorwood 我在答案中添加了一个示例。看看吧。
  • 一旦你有了一个ax对象,你也可以调用它上面的所有plt方法——ax.xlabelax.ylabelax.title
【解决方案2】:

由于month 是一个字符串数组,plt.plot() 命令按字母顺序对其进行排序。因此,我们必须使用xticks,然后像下面这样绘制它,以按照与原始数组month 中相同的顺序获取字符串。

In [16]: f = np.array([53, 56, 63, 72, 79, 86, 89, 88, 83, 74, 65, 56])
    ...: month = np.array(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"])
    ...: plt.xticks(range(len(f)), month)
    ...: plt.plot(f)

剧情:

注意:更多自定义图请参考:pylab date demo

【讨论】:

  • 非常感谢。我真的很感激:)
  • 请注意,与下面@AGN 的解决方案不同
  • @Eric 我在底部添加了一条注释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
相关资源
最近更新 更多