|
|
@@ -0,0 +1,182 @@
|
|
|
+import time
|
|
|
+from tarfile import data_filter
|
|
|
+
|
|
|
+import pandas as pd
|
|
|
+import matplotlib.pyplot as plt
|
|
|
+from datetime import datetime
|
|
|
+
|
|
|
+from pandas.io.sas.sas_constants import dataset_length
|
|
|
+
|
|
|
+# 示例数据(一组数据即可)
|
|
|
+data = [
|
|
|
+ {"time": 1114, "params": {"key1": 190, "key2": 328, "key3": 312}},
|
|
|
+ {"time": 1113, "params": {"key1": 150, "key2": 318, "key3": 334}},
|
|
|
+ {"time": 1112, "params": {"key1": 126, "key2": 299, "key3": 340}},
|
|
|
+ {"time": 1111, "params": {"key1": 119, "key2": 270, "key3": 350}},
|
|
|
+ {"time": 1110, "params": {"key1": 110, "key2": 200, "key3": 100}}
|
|
|
+]
|
|
|
+
|
|
|
+
|
|
|
+class DataVisualizer:
|
|
|
+ def __init__(self, data_list):
|
|
|
+ self.data_list = data_list
|
|
|
+ self.dfs = self._process_data_list()
|
|
|
+ self.keys = self._get_keys() # 自动获取所有key
|
|
|
+ # 添加中文字体配置
|
|
|
+ self._setup_chinese_font()
|
|
|
+
|
|
|
+ def _setup_chinese_font(self):
|
|
|
+ """配置中文字体支持"""
|
|
|
+ try:
|
|
|
+ plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']
|
|
|
+ plt.rcParams['axes.unicode_minus'] = False
|
|
|
+ except Exception as e:
|
|
|
+ print(f"字体配置警告: {e}")
|
|
|
+
|
|
|
+ def _process_data_list(self):
|
|
|
+ """处理多个原始数据为DataFrame列表"""
|
|
|
+ dfs = []
|
|
|
+ print(self.data_list)
|
|
|
+ for data in self.data_list:
|
|
|
+ df_data = []
|
|
|
+ for item in data:
|
|
|
+ row = {"time": item["time"]}
|
|
|
+ row.update(item["params"])
|
|
|
+ df_data.append(row)
|
|
|
+ df = pd.DataFrame(df_data)
|
|
|
+ df = df.sort_values('time') # 按时间升序排列
|
|
|
+ dfs.append(df)
|
|
|
+ return dfs
|
|
|
+
|
|
|
+ def _get_keys(self):
|
|
|
+ """自动获取所有key(即params中的键)"""
|
|
|
+ if self.dfs:
|
|
|
+ return list(self.dfs[0].columns) # 假设所有数据的key一致
|
|
|
+ return []
|
|
|
+
|
|
|
+ def get_data_summary(self):
|
|
|
+ """生成多个数据数组的统计摘要"""
|
|
|
+ summaries = []
|
|
|
+ for df in self.dfs:
|
|
|
+ summary = {'数据点数量': len(df), '时间范围': f"{df['time'].min()} - {df['time'].max()}"}
|
|
|
+ for key in self.keys:
|
|
|
+ start = df[key].iloc[0]
|
|
|
+ end = df[key].iloc[-1]
|
|
|
+ diff = end - start
|
|
|
+ rate = (diff / start) * 100 if start != 0 else 0
|
|
|
+ summary[f'{key}变化'] = f"{start} → {end} (Δ{diff}, {rate:.1f}%)"
|
|
|
+ summaries.append(summary)
|
|
|
+ return summaries
|
|
|
+
|
|
|
+ def convertTime(timesMs):
|
|
|
+ local_time = time.localtime(timesMs)
|
|
|
+ return f"{local_time.tm_hour:02d}:{local_time.tm_min:02d}"
|
|
|
+
|
|
|
+ def create_individual_key_plots11(self):
|
|
|
+ """为每个key单独生成一个独立图表"""
|
|
|
+ for key in self.keys:
|
|
|
+ if key == 'time':
|
|
|
+ continue
|
|
|
+ plt.figure(figsize=(10, 6))
|
|
|
+ for i, df in enumerate(self.dfs):
|
|
|
+ plt.plot(df['time'], df[key],
|
|
|
+ marker='o', linewidth=2, markersize=8,
|
|
|
+ label=f'数据组{i + 1} - {key}变化趋势')
|
|
|
+ print('xx = ' , df['time'])
|
|
|
+ print('mm = ', df[key])
|
|
|
+ for j, (time, value) in enumerate(zip(df['time'], df[key])):
|
|
|
+ plt.annotate(f'{value}', (time, value), textcoords="offset points", xytext=(0, 10), ha='center', fontsize=12)
|
|
|
+ plt.xlabel('时间', fontsize=12)
|
|
|
+ plt.ylabel('参数值', fontsize=12)
|
|
|
+ plt.title(f'{key}在不同数据组随时间的变化对比', fontsize=14, fontweight='bold')
|
|
|
+ plt.legend()
|
|
|
+ plt.grid(True, alpha=0.3)
|
|
|
+ plt.xticks(self.dfs[0]['time'])
|
|
|
+ plt.tight_layout()
|
|
|
+ plt.show()
|
|
|
+
|
|
|
+ def create_individual_key_plots(self):
|
|
|
+ """为每个key单独生成一个独立图表,时间戳转换为年月日时分秒格式"""
|
|
|
+ for key in self.keys:
|
|
|
+ if key == 'time':
|
|
|
+ continue
|
|
|
+ plt.figure(figsize=(10, 6))
|
|
|
+
|
|
|
+ # 存储所有格式化后的时间,用于统一x轴刻度
|
|
|
+ all_formatted_times = []
|
|
|
+
|
|
|
+ for i, df in enumerate(self.dfs):
|
|
|
+ # 将时间戳转换为年月日时分秒格式
|
|
|
+ formatted_times = []
|
|
|
+ for timestamp in df['time']:
|
|
|
+ # 假设时间戳为整数或浮点数
|
|
|
+ dt_obj = datetime.fromtimestamp(timestamp / 1000)
|
|
|
+ formatted_time = dt_obj.strftime("%H:%M:%S")
|
|
|
+ formatted_times.append(formatted_time)
|
|
|
+
|
|
|
+ # 如果是第一个数据组,保存格式化后的时间用于x轴刻度
|
|
|
+ if i == 0:
|
|
|
+ all_formatted_times = formatted_times
|
|
|
+
|
|
|
+ # 使用格式化后的时间进行绘图
|
|
|
+ plt.plot(formatted_times, df[key],
|
|
|
+ marker='o', linewidth=2, markersize=8,
|
|
|
+ label=f'数据组{i + 1} - {key}变化趋势')
|
|
|
+
|
|
|
+ print('原始时间戳 = ', df['time'])
|
|
|
+ print('格式化时间 = ', formatted_times)
|
|
|
+ print('数值数据 = ', df[key])
|
|
|
+
|
|
|
+ # 为每个数据点添加标注
|
|
|
+ for j, (formatted_time, value) in enumerate(zip(formatted_times, df[key])):
|
|
|
+ plt.annotate(f'{value}',
|
|
|
+ (formatted_time, value),
|
|
|
+ textcoords="offset points",
|
|
|
+ xytext=(0, 10),
|
|
|
+ ha='center',
|
|
|
+ fontsize=12)
|
|
|
+
|
|
|
+ plt.xlabel('时间', fontsize=12)
|
|
|
+ plt.ylabel('参数值', fontsize=12)
|
|
|
+ plt.title(f'{key}在不同数据组随时间的变化对比', fontsize=14, fontweight='bold')
|
|
|
+ plt.legend()
|
|
|
+ plt.grid(True, alpha=0.3)
|
|
|
+
|
|
|
+ # 设置x轴刻度为格式化后的时间
|
|
|
+ plt.xticks(all_formatted_times, rotation=45)
|
|
|
+ plt.tight_layout()
|
|
|
+ plt.show()
|
|
|
+
|
|
|
+def show(data1):
|
|
|
+ # 创建数据数组(示例:1个数据数组)
|
|
|
+ data_list = [data1]
|
|
|
+
|
|
|
+ # 创建可视化器实例
|
|
|
+ visualizer = DataVisualizer(data_list)
|
|
|
+
|
|
|
+ print("=" * 50)
|
|
|
+ print("数据表格展示")
|
|
|
+ print("=" * 50)
|
|
|
+ for i, df in enumerate(visualizer.dfs):
|
|
|
+ print(f"数据组{i + 1}表格:")
|
|
|
+ print(df)
|
|
|
+ print()
|
|
|
+
|
|
|
+ print("=" * 50)
|
|
|
+ print("数据统计摘要")
|
|
|
+ print("=" * 50)
|
|
|
+ summaries = visualizer.get_data_summary()
|
|
|
+ for i, summary in enumerate(summaries):
|
|
|
+ print(f"数据组{i + 1}统计摘要:")
|
|
|
+ for key, value in summary.items():
|
|
|
+ print(f" {key}: {value}")
|
|
|
+ print()
|
|
|
+
|
|
|
+ # 为每个key单独生成图表
|
|
|
+ print("正在生成每个key的独立对比图表...")
|
|
|
+ visualizer.create_individual_key_plots()
|
|
|
+
|
|
|
+'''
|
|
|
+if __name__ == "__main__":
|
|
|
+ main()
|
|
|
+'''
|