连接数据库案例
import pymysql # pip install pymysql安装,用来连接mysql数据库 import pandas as pd # 用来做数据导入(pd.read_sql_query() 执行sql语句得到结果df) import matplotlib.pyplot as plt # 用来画图(plt.plot()折线图, plt.bar()柱状图,....) plt.rcParams['font.sans-serif'] = 'SimHei' # 设置中文字体支持中文显示 plt.rcParams['axes.unicode_minus'] = False # 支持中文字体下显示'-'号 # figure 分辨率 800x600 plt.rcParams['figure.figsize'] = (6,4) # 8x6 inches plt.rcParams['figure.dpi'] = 100 # 100 dot per inch # 1. 连接MySQL数据库: 创建数据库连接 conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='root',db='mydb') # 2 创建一个sql语句 # -- 统计每个销售经理2019年的利润总额 sql = r"SELECT MANAGER, SUM(PROFIT) as TotalProfit FROM orders where FY='2019' group by MANAGER" # 3 执行sql语句获取统计查询结果 df = pd.read_sql_query(sql, conn) # 4. 基于DataFrame结果集作图 plt.figure(figsize=(6,4),dpi=120) plt.bar(df['MANAGER'], df['TotalProfit']) plt.grid(axis='y') plt.title("每个销售经理2019年的利润总额") plt.ylabel("利润额") for index,value in df['TotalProfit'].items(): plt.text(index,value,round(value),ha='center',va='bottom',color='k')
柱状图绘制
import matplotlib.pyplot as plt # 设置中文字体 plt.rcParams['axes.unicode_minus'] = False # 不使用中文减号 plt.rcParams['font.sans-serif'] = 'FangSong' # 设置字体为仿宋(FangSong) plt.figure(figsize=(5,3),dpi=120) plt.bar(data.index, data.values, width=0.1, align='edge', bottom=100000 ) # plt.grid(axis='x') plt.title("每个销售经理2019年的利润总额") plt.ylabel("利润额")
plt.figure(figsize=(6,6),dpi=100) plt.bar(data.index, data.values, width=0.6, align='edge', bottom=0-data.values ) plt.bar(data.index, data.values, width=0.6, align='edge', bottom=0 ) plt.grid(axis='x') plt.title("每个销售经理2019年的利润总额") plt.ylabel("利润额")
堆叠柱状图——尾部
txtfile = r'orders.txt' df_txt = pd.read_csv(txtfile) profit = df_txt[df_txt['FY']==2019].groupby('OPERATOR')['PROFIT'].sum() price = df_txt[df_txt['FY']==2019].groupby('OPERATOR')['PRICE'].sum() plt.rcParams['font.sans-serif'] = 'KaiTi' # 设置全局字体为中文 楷体 plt.rcParams['axes.unicode_minus'] = False # 不使用中文减号 plt.figure(figsize=(10,4),dpi=120) plt.bar(price.index, price.values, label='price' ) plt.bar(profit.index, profit.values, label='profit' ) # plt.grid(axis='x') #网格线 plt.title("每个销售经理2019年的利润总额") plt.ylabel("利润额",size=12) plt.xlabel("姓名",size=12) plt.legend()
堆叠柱状图——头部
txtfile = r'orders.txt' df_txt = pd.read_csv(txtfile) profit = df_txt[df_txt['FY']==2019].groupby('OPERATOR')['PROFIT'].sum() price = df_txt[df_txt['FY']==2019].groupby('OPERATOR')['PRICE'].sum() plt.figure(figsize=(6,6),dpi=100) plt.bar(price.index, price.values, label='price' ) plt.bar(profit.index, profit.values, label='profit', bottom=price.values ) # 在price头上画profit plt.grid(axis='x') plt.title("每个销售经理2019年的利润总额") plt.ylabel("利润额") plt.legend()
双维柱状图模板
import numpy as np txtfile = r'orders.txt' df_txt = pd.read_csv(txtfile) profit = df_txt[df_txt['FY']==2019].groupby('OPERATOR')['PROFIT'].sum() price = df_txt[df_txt['FY']==2019].groupby('OPERATOR')['PRICE'].sum() plt.rcParams['font.sans-serif'] = 'KaiTi' # 设置全局字体为中文 楷体 plt.rcParams['axes.unicode_minus'] = False # 不使用中文减号 plt.figure(figsize=(10,6),dpi=120) # 如果要改变柱子在X轴的位置,需要设置Xticks的数值 x = price.index x_ticks = np.arange(price.size) # 将两个柱子的X坐标错开,一个减去柱子宽度的一般,一个加上柱子宽度的一半 width = 0.4 plt.bar(x_ticks-(width/2), price.values, label='price', width=width ) plt.bar(x_ticks+(width/2), profit.values, label='profit', width=width) # 在price头上画profit plt.xticks(x_ticks,x) plt.grid(axis='x') plt.title("每个销售经理2019年的利润总额") plt.ylabel("利润额") plt.legend()
x = df['统计时间'] x_ticks = np.arange(df['统计时间'].size) # 将两个柱子的X坐标错开,一个减去柱子宽度的一般,一个加上柱子宽度的一半 total_width, n = 0.8, 3 width = total_width / n x1 = x_ticks - (total_width - width) / 2 plt.bar(x1,df['粮食产量增长(%)'], label='粮食', width=width ) plt.bar(x1+width,df['棉花增长(%)'], label='棉花', width=width) plt.bar(x1+(width*2),df['油料增长(%)'],label='油料', width=width) plt.xticks(x_ticks,x) plt.grid(axis='x') #添加网格 plt.title("2010-2021年粮棉油增长率柱状图",size=17,y=1.02) plt.xlabel('时间',font_dict) plt.ylabel('增长率(%)',font_dict) plt.legend()