Когда я пытаюсь построить следующие данные
import pandas as pd
dfx = pd.DataFrame()
dfx['bing'] = [1,2,3,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]
dfx['bang'] = [np.nan,np.nan,np.nan,4,5,6,np.nan,np.nan,np.nan]
dfx['boo'] = [np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,7,8,9]
dfx.plot()
plt.show()
Я получаю эту строку с пробелами. Я хочу иметь возможность использовать разные цвета для разных сегментов моей линии, но также хотел бы, чтобы они были «связаны».
Две возможные идеи:
Вариант 1: Используйте df.fillna:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
dfx = pd.DataFrame()
dfx['bing'] = [1,2,3,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]
dfx['bang'] = [np.nan,np.nan,np.nan,4,5,6,np.nan,np.nan,np.nan]
dfx['boo'] = [np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,7,8,9]
dfx.fillna(method='bfill', axis=1).plot()
plt.show()
# i.e. we're plotting:
array([[ 1., nan, nan],
[ 2., nan, nan],
[ 3., nan, nan],
[ 4., 4., nan],
[ 5., 5., nan],
[ 6., 6., nan],
[ 7., 7., 7.],
[ 8., 8., 8.],
[ 9., 9., 9.]])
Результат:
Вариант 2: добавьте линию для соединения других линий
Немного больше работы (хотя может быть более быстрый способ построить линию «соединителя», чем подход, который я использую здесь). Добавьте столбец, соединяющий конец одной строки с началом следующей. Например.:
dfx = pd.DataFrame()
dfx['bing'] = [1,2,3,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]
dfx['bang'] = [np.nan,np.nan,np.nan,4,5,6,np.nan,np.nan,np.nan]
dfx['boo'] = [np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,7,8,9]
# get index vals end-start: array([2, 3, 5, 6], dtype=int64)
s = dfx.apply(lambda col: (col.first_valid_index(),
col.last_valid_index()))\
.stack().sort_values().to_numpy()[1:-1]
# create extra col with connection btw consecutive lines
dfx['connect'] = dfx.fillna(method='ffill', axis=1).iloc[:,-1]\
.mask(~dfx.index.isin(s))
# print(dfx.connect.to_numpy())
# [nan nan 3. 4. nan 6. 7. nan nan]
fig, ax = plt.subplots(figsize=(12,8))
colors = ['blue','orange','green','black']
for i, col in enumerate(dfx.columns):
if col == 'connect':
# add `label=col` if you want "connect" in the legend as well
ax.plot(dfx[col], colors[i], linestyle='dotted')
else:
ax.plot(dfx[col], colors[i], label=col)
ax.legend()
plt.show()
Результат: