我一直在尝试根据频率绘制日期。 这是我的数据集的样子:
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非常混乱。我希望仅在值发生变化时才显示标签中的日期。 我不知道该怎么做。 感谢帮助。 谢谢!
答案 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'])
尽管我不建议这样做(不相等的间距看起来很杂乱)