仅在频率变化时绘制日期

时间:2019-02-22 13:39:05

标签: python csv date matplotlib

我一直在尝试根据频率绘制日期。 这是我的数据集的样子:

2017-07-04,13
2018-04-11,13
2017-08-17,13
2017-08-30,13
2018-04-26,12
2018-01-03,12
2017-07-05,11
2017-06-21,11

这是我尝试过的代码:

with open('test.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerows(temp)

### Extract data from CSV ###
with open('test.csv', 'r') as n:
    reader = csv.reader(n)
    dates = []
    freq = []
    for row in reader:
        dates.append(row[0])
        freq.append(row[1])

fig = plt.figure()

graph = fig.add_subplot(111)

# Plot the data as a red line with round markers
graph.plot(dates, freq, 'r-o')
graph.set_xticks(dates)

graph.set_xticklabels(
    [dates]
)

plt.show()

这是我得到的结果:

SecurityFilterAutoConfiguration

xlabel非常混乱。我希望仅在值发生变化时才显示标签中的日期。 我不知道该怎么做。 感谢帮助。 谢谢!

1 个答案:

答案 0 :(得分:1)

首先,我强烈建议您使用pandas库及其DataFrame对象来处理数据。它具有一些非常有用的功能,例如read_csv,可以为您节省一些工作。

要让matplotlib更加合理地分隔xticks,您需要将日期转换为datetime对象(而不是将日期存储为字符串)。

在这里,我将用熊猫读取您的数据,按日期解析日期和顺序:

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

# Read data
df = pd.read_csv('/path/to/test.csv', names=['date', 'freq'], parse_dates=['date'])
# Sort by date
df.sort_values(by='date', inplace=True)

然后您可以继续绘制数据(您需要使用最新版本的熊猫来自动处理日期):

fig, ax = plt.subplots(1, 1)

# Plot date against frequency
ax.plot(df['date'], df['freq'], 'r-o')

# Rotate the tick labels
ax.tick_params(axis='x', rotation=45)

fig.tight_layout()

如果您只想在频率更改时显示日期,则可以使用以下方法

ax.set_xticks(df.loc[np.diff(df['freq']) != 0, 'date'])

尽管我不建议这样做(不相等的间距看起来很杂乱)