Немного новичок в python, поэтому, возможно, код можно улучшить.
У меня есть текстовый файл со значениями x и y, разделенными некоторым NaN между ними.
Данные идут от -x к x, а затем возвращаются (от x к -x), но с несколько другими значениями y, скажем:
x=np.array([-0.02,-0.01,0,0.01,0.02,NaN,1,NaN,0.02,0.01,0,-0.01,-0.02])
И я хотел бы построить (matplotlib) до первого NaN с определенным форматом, x = 1 с другим форматом и последним набором данных с третьим другим форматом (цвет, маркер, ширина линии...).
Конечно, данные, которые у меня есть, немного сложнее, но я думаю, что это простая полезная аппроксимация.
Есть идеи? Я использую pandas в качестве инструмента для обработки данных.
Вы можете создать групповую метку, используя cumsum
, где x равно нулю. Затем вы можете определить словарь с ключом метки со значениями, представляющими собой словарь, содержащий все параметры построения. Используйте groupby
, чтобы построить каждую группу отдельно, распаковав все параметры, чтобы установить аргументы для этой группы.
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
x = np.array([-0.02,-0.01,0,0.01,0.02,np.NaN,1,np.NaN,0.02,0.01,0,-0.01,-0.02])
df = pd.DataFrame({'x': x})
df['label'] = df.x.isnull().cumsum().where(df.x.notnull())
plot_params = {0: {'lw': 2, 'color': 'red', 'marker': 'o'},
1: {'lw': 6, 'color': 'black', 'marker': 's'},
2: {'lw': 9, 'color': 'blue', 'marker': 'x'}}
fig, ax = plt.subplots(figsize=(3,3))
for label, gp in df.groupby('label'):
gp.plot(y='x', **plot_params[label], ax=ax, legend=None)
plt.show()
Вот как выглядит df
для справки после определения метки группы
print(df)
x label
0 -0.02 0.0
1 -0.01 0.0
2 0.00 0.0
3 0.01 0.0
4 0.02 0.0
5 NaN NaN
6 1.00 1.0
7 NaN NaN
8 0.02 2.0
9 0.01 2.0
10 0.00 2.0
11 -0.01 2.0
12 -0.02 2.0
Хорошее решение, имеет смысл добавлять эту новую метку для каждого набора значений. В итоге я выбрал
df[df["label"]==0.0].x df[df["label"]==1.0].x
... и т. д., чтобы это имело смысл с остальной частью моего предыдущего кода.