Дата составления графика только при изменении частоты - PullRequest
0 голосов
/ 22 февраля 2019

Я пытался построить дату против частоты.Вот как выглядит мой набор данных:

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

Xlabels очень загромождены.Я хочу, чтобы даты в метках отображались только при изменении значения.Я не знаю, как это сделать.Помощь приветствуется.Спасибо!

1 Ответ

0 голосов
/ 22 февраля 2019

Во-первых, я настоятельно рекомендую вам использовать библиотеку 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'])

, хотя я бы не рекомендовал это (неравный интервал выглядит грязным)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...