import logging import pymysql import subprocess import numpy as np from matplotlib import pyplot as plt from tkinter import Tk from pyecharts import options as _opts from pyecharts.charts import Bar logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') #db_config={'host':'127.0.0.1','user':'root','password':'mysql>hyx123','db':'airquility','charset':'utf8'} #ptimelist=[] #cilist=[] #data_dict=dict(zip(ptimelist,cilist)) def get_data(db_config): """ 从数据库中获取ptime和ci数据。 :param db_config: 数据库配置字典 :return: 包含ptime和ci的元组列表 """ ptime_list = [] # 存储ptime数据的列表 ci_list = [] # 存储ci数据的列表 try: with pymysql.connect(**db_config) as conn: logging.info("数据库连接成功") with conn.cursor() as cursor: # 使用单个查询以提高性能 sql_ptime = "SELECT ptime FROM May" cursor.execute(sql_ptime) data_ptime = cursor.fetchall() ptime_list = [row['ptime'] for row in data_ptime if 'ptime' in row] #row_list=[val for sublist in row for val in sublist] sql_ci="SELECT ci FROM may" cursor.execute(sql_ci) data_ci=cursor.fetchall() #print(data_ci) ci_list = [row['ci'] for row in data_ci if 'ci' in row] sql_so = "SELECT so FROM may" cursor.execute(sql_so) data_so = cursor.fetchall() so_list = [row['so'] for row in data_so if 'so' in row] sql_no = "SELECT no FROM may" cursor.execute(sql_no) data_no = cursor.fetchall() no_list = [row['no'] for row in data_no if 'no' in row] sql_pm = "SELECT pm FROM may" cursor.execute(sql_pm) data_pm = cursor.fetchall() pm_list = [row['pm'] for row in data_pm if 'pm' in row] return ptime_list, ci_list, so_list, no_list, pm_list except pymysql.err.OperationalError as e: logging.error(f"数据库操作失败: {e}") # 根据具体场景,可以选择返回空列表、抛出异常或返回特定错误码 return [], [], [], [], [] #except Exception as e: #logging.error(f"未知错误: {e}") # 同上,根据具体场景进行处理 #return [], [] def visualize_data(ptime_list, ci_list, so_list, no_list, pm_list): """ 可视化数据。 :param ptime_list: ptime数据列表 :param ci_list: ci数据列表 :param column_to_plot: 需要绘制的列名 """ if not ptime_list or not ci_list or not so_list or not no_list or not pm_list: logging.error("数据为空,无法进行可视化") return #y_list=[] #for i in range(4,8): # y_list.append(i) plt.figure(figsize=(15,10),dpi=80) x = np.arange(26) bar_width = 0.2 """ plt.bar(ptime_list, # 柱状图柱体标签值 ci_list, # 柱体高度 align='center', # 柱体对齐方式 color='red', # 柱体颜色 tick_label=ptime_list, # 刻度标签值 hatch='/') # 填充样式,越密集填充就越密 plt.bar(ptime_list, # 柱状图柱体标签值 so_list, # 柱体高度 align='center', # 柱体对齐方式 color='blue', # 柱体颜色 tick_label=ptime_list, # 刻度标签值 hatch='/') # 填充样式,越密集填充就越密 """ plt.xlabel('Ptime') plt.bar(ptime_list, ci_list, tick_label=ptime_list, width=bar_width) plt.bar(x + bar_width, so_list, width=bar_width) #plt.bar(x + bar_width, no_list, width=bar_width) #plt.bar(x + bar_width, pm_list, width=bar_width) plt.title('CI over time') plt.show() if __name__ == "__main__": db_config = { "host": '127.0.0.1', "user": "root", "password": 'mysql>hyx123', "db": 'airquility', "charset": 'utf8', "cursorclass": pymysql.cursors.DictCursor } ptime_list, ci_list, so_list, no_list, pm_list = get_data(db_config) visualize_data(ptime_list, ci_list, so_list, no_list, pm_list) print(pymysql.__version__) ''' window= Tk() window.title("每日空气质量") window.geometry("300x200") #Label(window, text="图表已生成为air_quality_index.html").pack() window.mainloop() '''