Python - Как построить данные с повторяющейся осью x

Я хотел бы нанести на график данные, зависящие от дня за многие годы, где годы должны быть на оси x (например, 2016,2017,2018). Как это сделать?

Для каждого года у меня есть список дней, которые я бы нанес на ось x, но, конечно, python сохраняет эту ось и отображает все данные за разные годы друг над другом.

Какие-либо предложения?

Код:

Укороченная версия моего словаря L_B_1_mean выглядит так:

2016018 5.68701407589
2016002 4.72437644462
2017018 3.39389424822
2018034 7.01093439059
2018002 8.79958946488
2017002 3.55897852367

код:

data_plot = {"x":[], "y":[], "label":[]}
for label, coord in L_B_1_mean.items():
    data_plot["x"].append(int(label[-3:]))             
    data_plot["y"].append(coord)
    data_plot["label"].append(label)


# add labels
for label, x, y in zip(data_plot["label"], data_plot["x"], data_plot["y"]):
    axes[1].annotate(label, xy = (x, y+0.02), ha= "left")


# 1 channel different years Plot
plt_data = axes[1].scatter(data_plot["x"], data_plot["y"])

Я создаю свои x-значения здесь: data_plot["x"].append(int(label[-3:])), где я читаю тег имени, например: 2016002, и получаю только значение дня: 002

В итоге у меня 365 дней в году, и теперь я хотел бы построить данные за 2016 год, затем за 2017 год, а затем за 2018 год все друг за другом, а не поверх друг друга.

Привет @Shaun, не могли бы вы опубликовать то, что вы пробовали до сих пор? И не могли бы вы добавить примеры данных в свой код, чтобы людям было легче вам помочь? Ваш вопрос выглядит слишком широким, чтобы получить хороший ответ ...

toti08 02.10.2018 09:26

@ toti08 хм, хорошо ... я подумал, что это больше похоже на концептуальный вопрос, есть ли способ повторить ось x и присвоить ей данные. Но я добавлю код в вопрос

Shaun 02.10.2018 09:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
962
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У тебя есть диктат

L_B_1_mean 

{'2016018': 5.68701407589,
 '2016002': 4.72437644462,
 '2017018': 3.39389424822,
 '2018034': 7.010934390589999,
 '2018002': 8.79958946488,
 '2017002': 3.55897852367}

сюжет с использованием панд:

import pandas as pd

Вы можете просто создать серию панд из этого dict:

s = pd.Series(L_B_1_mean)

2016018    5.687014
2016002    4.724376
2017018    3.393894
2018034    7.010934
2018002    8.799589
2017002    3.558979
dtype: float64

... и приведите строки в указателе к датам:

s.index = pd.to_datetime(s.index, format='%Y%j')

2016-01-18    5.687014
2016-01-02    4.724376
2017-01-18    3.393894
2018-02-03    7.010934
2018-01-02    8.799589
2017-01-02    3.558979
dtype: float64

Затем вы можете легко построить свои данные:

s.plot(marker='o')

график с использованием datetime и matplotlib:

import datetime as DT
import matplotlib.pyplot as plt

t = [DT.datetime.strptime(k, '%Y%j') for k in L_B_1_mean.keys()]
v = list(L_B_1_mean.values())

v = sorted(v, key=lambda x: t[v.index(x)])
t = sorted(t)

plt.plot(t, v, 'b-o')

это очень хороший способ построения данных. L_B_1 - это словарь, поэтому я получаю следующее: AttributeError: 'dict' object has no attribute 'yearday'. Также мой код отображает данные. Однако я хотел бы получить все данные за 2016 год за 365 дней, а затем за новые данные за 365 дней 2017 года и т. д. Я думаю, что ваш код строится так же, как мой :), и это не совсем то, что я ищу .

Shaun 02.10.2018 13:42

Я почти подумал, что это будет так, потому что я не совсем понял, какой у вас вариант и чего вы хотите достичь. А то, что у вас диктант, тоже не было в голове - извините ... Отредактирую ...

SpghttCd 02.10.2018 13:45

Другие вопросы по теме