Проблемы с отображением временных меток по оси X с помощью MatplotlibPython

Программы на Python
Ответить
Anonymous
 Проблемы с отображением временных меток по оси X с помощью Matplotlib

Сообщение Anonymous »

Я работаю над сценарием Python, который загружает несколько файлов CSV, содержащих временные метки и данные проверки связи, а затем отображает их на графике. Предполагается, что на оси X будут отображаться временные метки в формате ЧЧ:ММ, причем временные метки поступают из нескольких файлов CSV, в которых записаны разные значения пинга для разных адресов.
Проблема в том, что я только хотите отображать ограниченное количество временных меток для оси X, например. 10–12 временных меток в зависимости от количества точек данных в файлах CSV. Я также хочу убедиться, что ось X правильно помечена соответствующими временными метками и соответствующими значениями пинга.
Проблема:
На графике показаны данные, но временные метки на Ось X неверна, и появляется слишком мало делений. Отображается только первая временная метка, а по оси X генерируются только 8 делений.
Кроме того, похоже, что отметки по оси X не соответствуют меткам времени из данных правильно, что влияет на читаемость графика.
Цель:
Ось X должна правильно отображать временные метки в формате ЧЧ:ММ:СС для всех адресов из файлов CSV. p>
Я бы хотелось бы иметь ограниченное количество временных меток (около 10–12) по оси X на основе данных в файлах CSV.
Важно отметить, что информация для график хранится в x_labels и x_positions.
11 подразделений также правильно созданы и сохранены для 99 записей данных, но они по-прежнему отображаются неправильно.
Пример:
x_positions: [0.0, 2.55, 5.1, 7.65, 10.216666666666667, 12.766666666666667, 15.316666666666666, 17.866666666666667, 20.416666666666668, 22.983333333333334, 25.533333333333335]
x_labels: ['17:24:43', '17:27:16', '17:29:49', '17:32:22', '17:34:56', '17:37:29', '17:40:02', '17:42:35', '17:45:08', '17:47:42', '17 :50:15']
Вот такая картинка, но на ней должно быть 11 разделительных линий по оси X, и все они должны быть помечено
Изображение

Вот мой код:
import os
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime, timedelta

# Funktion zum Laden der Daten aus den CSV-Dateien
def load_data(folder):
data = {}
for root, dirs, files in os.walk(folder):
for file in files:
if file.endswith(".csv"):
address = file.replace('_', '.').replace('.csv', '')
file_path = os.path.join(root, file)
df = pd.read_csv(file_path)
df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S')
df['Ping (ms)'] = df['Ping (ms)'].apply(lambda x: 0 if x == 0 else x)
data[address] = df
return data

# Funktion zum Erstellen des Plots
def plot_data(data):
plt.figure(figsize=(14, 8))
colors = generate_colors(len(data))

# Bestimme die Anzahl der Datenpunkte für eine einzelne Adresse
df = next(iter(data.values())) # Wähle den ersten DataFrame aus
total_data_points = len(df)

# Berechne den dif-Wert
dif = total_data_points // 10
if dif < 1:
dif = 1

# Sammle alle Zeitstempel für die X-Achse
x_labels = []
x_positions = []
for i in range(0, len(df), dif):
time = df['Time'].iloc
x_labels.append(time.strftime('%H:%M:%S'))
x_positions.append((time - min(df['Time'])).total_seconds() / 60)

# Plotten der Ping-Daten für jede Adresse
for idx, (address, df) in enumerate(data.items()):
df['Time_diff'] = (df['Time'] - min(df['Time'])).dt.total_seconds() / 60
mask_timeout = df['Ping (ms)'] == 0
mask_normal = ~mask_timeout

plt.plot(df['Time_diff'][mask_normal], df['Ping (ms)'][mask_normal], label=address, color=colors[idx % len(colors)])
plt.plot(df['Time_diff'][mask_timeout], df['Ping (ms)'][mask_timeout], color='r', lw=2)

# Anpassen der X-Achse
plt.xticks(x_positions, x_labels, rotation=45, ha='right')

plt.xlabel('Time')
plt.ylabel('Ping (ms)')
plt.title('Ping Times for Different Addresses')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

def generate_colors(n):
colors = []
for i in range(n):
hue = i / n
colors.append(plt.cm.hsv(hue))
return colors

# Main-Funktion
def main():
data_folder = input("Bitte geben Sie den Pfad zum Ordner mit den CSV-Dateien ein: ")
if not os.path.exists(data_folder):
print(f"Der Ordner {data_folder} existiert nicht.")
return

data = load_data(data_folder)
plot_data(data)

if __name__ == "__main__":
main()


Подробнее здесь: https://stackoverflow.com/questions/792 ... matplotlib
Ответить

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

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

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

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

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