Как насчет следующего?Это должно работать для произвольного списка отрезков.Давайте создадим задачу так, как вы это сделали:
import pandas as pd
import matplotlib.pyplot as plt
line_segments_by_X = [(1,2), (3,4)]
data = {"X": list(x for x in range(5)),
"V0": list(x for x in range(10, 15)),
"V1": list(x for x in range(20, 25))}
df = pd.DataFrame(data, columns=["X", "V0", "V1"])
Здесь я создаю фигуру и ось для построения графика, а затем зацикливаю каждый сегмент.
fig, ax = plt.subplots(1, 1)
for segment in line_segments_by_X:
# Bool of values in segment
bool = (df['X'] >= segment[0]) & (df['X'] <= segment[1])
# Use bool to plot the lines in this segment
ax.plot(df['X'][bool], df['V0'][bool], c='C0', label='V0')
ax.plot(df['X'][bool], df['V1'][bool], c='C1', label='V1')
В цикле над сегментамиЯ фактически добавил каждый ярлык к легенде дважды.Давайте удостоверимся, что каждая метка встречается только один раз, и назовите вашу ось x:
handles, labels = ax.get_legend_handles_labels()
by_label = OrderedDict(zip(labels, handles))
ax.legend(by_label.values(), by_label.keys())
ax.set_xlabel('x')
Это дало мне график ниже:
