Python:如何使用matplotlib.pyplot更改x轴间隔以显示12个月?

时间:2017-04-21 09:04:13

标签: python matplotlib

我正在尝试制作一个显示全年数据的图表。数据来自CSV文件(records.csv),如下所示:

month,data
2016-01,66
2016-02,68
2016-03,70
2016-04,72
2016-05,74
2016-06,76
2016-07,78
2016-08,80
2016-09,82
2016-10,84
2016-11,86
2016-12,88

我的代码如下:

import csv
from datetime import datetime
from matplotlib import pyplot as plt

def date_to_list(index):
    """ save date to a list """
    results = []
    for row in data:
        results.append(datetime.strptime(row[index], '%Y-%m'))
    return results

def data_to_list(index):
    """ save data to a list """
    results = []
    for row in data:
        results.append(int(row[index]))
    return results


filename = 'records.csv'
with open(filename) as f:
    data = csv.reader(f)
    header = next(data)
    data = list(data)

    # save data and date to list
    records = data_to_list(1)
    date = date_to_list(0)

    plt.plot(date, records)
    plt.show()

然后我有一个如下图表: enter image description here

目前我正在努力解决以下两个问题:

  1. 此处x轴仅显示6个月,我怎样才能获得12个月?或者在 另一种说法,我怎样才能改变我想要的间隔,例如通过 月/季度/年?
  2. 我想,这条线的左侧和右侧有一些空间 这也是由于x轴范围。我怎样才能直接制作这条线 从矩形区域左侧(和右侧)开始(& end)?

2 个答案:

答案 0 :(得分:1)

为了设置刻度的位置,您可以使用matplotlib.dates.MonthLocator。为了使刻度具有特定格式,您可以使用matplotlib.dates.DateFormatter。为了使ticklabel不重叠,您可以使用autofmt_xdate()。为了没有边距,您可以使用plt.margins(x=0,y=0)

plt.gca().xaxis.set_major_locator(matplotlib.dates.MonthLocator()) 
plt.gca().xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%Y-%m"))
plt.gcf().autofmt_xdate()
plt.margins(x=0,y=0)

enter image description here

完整代码:

data = u"""month,data
2016-01,66
2016-02,68
2016-03,70
2016-04,72
2016-05,74
2016-06,76
2016-07,78
2016-08,80
2016-09,82
2016-10,84
2016-11,86
2016-12,88"""

import matplotlib.pyplot as plt
import matplotlib.ticker
import matplotlib.dates
import csv
from datetime import datetime
import io

def date_to_list(index):
    """ save date to a list """
    results = []
    for row in data:
        results.append(datetime.strptime(row[index], '%Y-%m'))
    return results

def data_to_list(index):
    """ save data to a list """
    results = []
    for row in data:
        results.append(int(row[index]))
    return results

with io.StringIO(data) as f:
    data = csv.reader(f)
    header = next(data)
    data = list(data)

    # save data and date to list
    records = data_to_list(1)
    date = date_to_list(0)

    plt.plot(date, records)
    plt.gca().xaxis.set_major_locator(matplotlib.dates.MonthLocator())
    plt.gca().xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%Y-%m"))
    plt.gcf().autofmt_xdate()
    plt.margins(x=0,y=0)
    plt.show()

答案 1 :(得分:0)

您可以使用<{p}设置自定义标签,使用

设置x轴上的自定义刻度和范围
labels = [i[0] for i in data]

这将按照您在问题中使用的样式为每个月生成一个标签。选择x限制使得刻度居中。但请注意,x轴有点混乱。为了避免这种情况,您可以:

  1. 沿x方向拉伸你的情节。
  2. 大幅减少字体大小。
  3. 考虑减少绘图中显示的标签数量。 enter image description here