【问题标题】:Matplotlib fix axis - too many datesMatplotlib 修复轴 - 日期过多
【发布时间】:2018-06-13 21:00:27
【问题描述】:

我有大数据作为 csv 文件,其中包含太多日期,所以当我绘制它时,x 轴会写入所有日期,例如 f.e :从 2000-12-242017-12-24 以及 y 轴。

我尝试使用一个集合,但该集合需要排序,问题是当我对其进行排序时,Y 中的数据不适用于任何排序日期。

import matplotlib.pyplot as plt
import urllib as u
import numpy as np
import csv

stock_price_url = 'https://pythonprogramming.net/yahoo_finance_replacement'

date = []
openp = []
high = []
low = []
close = []
adjclose = []
volume = []

text = u.request.urlopen(stock_price_url).read().decode()
with open('nw.csv', 'w') as fw:
    fw.write(text)
    fw.close()

with open('nw.csv', 'r') as csvf:
f = csv.reader(csvf, delimiter=',')
for row in f:
    if 'Date' not in row:
        date.append(row[0])
        openp.append(row[1])
        high.append(row[2])
        low.append(row[3])
        close.append(row[4])
        adjclose.append(row[5])
        volume.append(row[6])

dateset = set([])            
for z in date:
   dateset.add(z[:4])

highset = []
for z in high:
    highset.append(z[:3])


plt.plot(set(dateset), set(highset), linewidth=0.5)
plt.show()

【问题讨论】:

  • 那么,你的问题是什么?
  • 我认为pandas 可能会帮助您解决问题。更多信息请参见thisthisthis 帖子。

标签: python csv numpy datetime matplotlib


【解决方案1】:

您需要先将日期转换为 Python datetime 对象。然后可以将其转换为 matplotlib 编号。有了这个,你可以告诉 matplotlib 根据年份或月份的变化添加刻度:

from datetime import datetime
import matplotlib
import matplotlib.pyplot as plt
import urllib as u
import numpy as np
import csv

stock_price_url = 'https://pythonprogramming.net/yahoo_finance_replacement'

date = []
high = []

text = u.request.urlopen(stock_price_url).read().decode()

with open('nw.csv', 'w') as f_nw:
    f_nw.write(text)

with open('nw.csv', 'r', newline='') as f_nw:
    csv_nw = csv.reader(f_nw)
    header = next(csv_nw)

    for row in csv_nw:
        date.append(matplotlib.dates.date2num(datetime.strptime(row[0], '%Y-%m-%d')))
        high.append(row[2])

ax = plt.gca()
#ax.xaxis.set_minor_locator(matplotlib.dates.MonthLocator([1, 7]))
#ax.xaxis.set_minor_formatter(matplotlib.dates.DateFormatter('%b'))
ax.xaxis.set_major_locator(matplotlib.dates.YearLocator())
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%Y'))
#ax.tick_params(pad=20)

plt.plot(date, high, linewidth=0.5)
plt.show()   

这只会给你几年:

或者,如果您取消注释次要定位器/格式化程序,您会得到:

注意:

  1. 如果使用 with 块打开文件,则无需关闭文件。

  2. 脚本假定您使用的是 Python 3.x。

  3. 要跳过标头,只需使用 next() 读取它,然后再遍历 for 循环中的行。

【讨论】:

  • 不客气!不要忘记单击向上/向下按钮下的灰色勾号以接受答案作为已接受的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 2013-09-10
  • 2020-10-01
  • 2015-05-02
  • 2020-06-09
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多