Как нарисовать вертикальные пунктирные линии на последнем значении не нанового для каждого сублиста на графике?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как нарисовать вертикальные пунктирные линии на последнем значении не нанового для каждого сублиста на графике?

Сообщение Anonymous »

У меня есть flat_list значений, которые я разделял на сублисты одинакового размера D для набора пациентов. Данные каждого пациента построены с течением времени (дни), и я хочу нарисовать вертикальную пунктирную линию в том же цвете, что и кривая пациента на последнем не нановом X-положении каждого сублиста. Пунктирные линии должны простираться от глобального Y_MIN - смещение на y_max + смещение. < /P>
Вот минимальный пример: < /p>

Код: Выделить всё

import matplotlib.pyplot as plt
import numpy as np

def plot_app_efficiency(flat_list, D, P):
if len(flat_list) % D != 0:
raise ValueError("The length of the list must be a multiple of D.")

# Split data for each patient
patient_data = {}
for idx, p_id in enumerate(P):
start_idx = idx * D
end_idx = (idx + 1) * D
patient_data[p_id] = flat_list[start_idx:end_idx]

# X-axis: days from 1 to D
days = list(range(1, D + 1))

# Create plot
fig, ax = plt.subplots(figsize=(10, 6))

# Calculate global y_min and y_max across all patients
all_values = np.concatenate([np.array(values) for values in patient_data.values()])
y_min = np.nanmin(all_values)
y_max = np.nanmax(all_values)

for patient, values in patient_data.items():
values = np.array(values)
line, = ax.plot(days, values, label=f'Patient {patient}', marker='o')

# Find the last valid (non-NaN) value
valid_indices = np.where(~np.isnan(values))[0]
if len(valid_indices) > 0:
last_valid_index = valid_indices[-1]
x_val = days[last_valid_index]

# Axis labels and title
ax.set_xlabel('Days (D)')
ax.set_ylabel('Value')
ax.set_title('Values per patient over days')

# Remove grid
ax.grid(False)

# Horizontal legend below the plot
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.15),
fancybox=True, shadow=False, ncol=len(P))

plt.tight_layout()
plt.show()

#Example Call
a= [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 0.3, 0.3, 0.3, 0.3, 0.4, 0.4, 0.4, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 0.3, 0.3, 0.3, 0.3, 0.3, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]
b=40
c=[1,2,3]
plot_app_efficiency(a, b, c)
Это то, на что он должен выглядеть (извините за плохой рисунок):


Подробнее здесь: https://stackoverflow.com/questions/797 ... sublist-in
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»