仅在频率变化时绘制日期

问题描述 投票:0回答:1

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

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()

这是我得到的结果:

enter image description here

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

python csv date matplotlib
1个回答
1
投票

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

要使matplotlib空间更加合理,您需要将日期转换为datetime对象(而不是将日期存储为字符串)。

在这里,我将使用pandas读取您的数据,解析日期和按日期排序:

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)

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

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'])

虽然我不推荐它(不等间距看起来很乱)

© www.soinside.com 2019 - 2024. All rights reserved.