使用seaborn进行绘制
plt.figure(figsize=(10,16)) tips["weekend"] = tips["day"].isin(["Sat", "Sun"]) plt.subplot(321) sns.barplot(data=tips,x="day", y="total_bill", hue="weekend", dodge=False) plt.subplot(322) sns.pointplot(data=tips,x="day", y="total_bill", hue="weekend", dodge=False) plt.subplot(323) sns.boxplot(data=tips,x="day", y="total_bill", hue="weekend", dodge=False) plt.subplot(324) sns.violinplot(data=tips,x="day", y="total_bill", hue="weekend", dodge=False) plt.subplot(325) sns.stripplot(data=tips,x="day", y="total_bill", hue="weekend", dodge=False) plt.subplot(326) sns.swarmplot(data=tips,x="day", y="total_bill", hue="weekend", dodge=False)
fig = plt.figure(figsize=(10,5)) sns.violinplot(data=df,x='PROD_TYPE',y='PRICE',figure=fig) #sns.violinplot(data=df,x='OPERATOR',y='PROFIT',figure=fig)
可能看到这里,有些小伙伴都没有理解绘制线形图的要点和精髓,那么下面我们继续在此基础上研究图形的配置和数据源的选择!
线形图的直观可视化
plt.boxplot([1,2,3,4,5,6,7,8,9,10,20]) # 箱型图 plt.scatter(np.full(11,2),[1,2,3,4,5,6,7,8,9,10,20]) # 散点图
加一组散点图和线形图进行对比,我们发现线形图反映的是数据的分布特点,也就是我们散点图的可视化,只不过,线形图有更好的指标让我们一目了然的去看出数据的特点。
加一组直方图
N = np.random.randn(1000)*0.5 # Normal 产生1000各满足正态分布的随机数数组 plt.figure(dpi=120) plt.boxplot(N) plt.scatter(np.full_like(N,2),N,s=0.3,alpha=0.5,) plt.hist(N,orientation='horizontal',density=True)
剖析线形图的原理
N = [ -2,1,3,4,5,6,7,8,9, 17, 20] Q0 = np.quantile(N,q=0/4) # 最小值 Q1 = np.quantile(N,q=1/4) # 箱子的下边 Q2 = np.quantile(N,q=2/4) # 箱子的中位数线 Q3 = np.quantile(N,q=3/4) # 箱子的上边 Q4 = np.quantile(N,q=4/4) # 最大值 M = np.mean(N) IQR = Q3-Q1 # 箱子的长度 Upper = Q3 + 1.5*IQR # 箱线图的上限 (限制,如果值超过这个限度,就是异常值) Lower = Q1 - 1.5*IQR # 箱线图的下限 (限制,如果值不超过这个限度,就取不超限的最小值) print(f"Q3={Q3}, Q1={Q1}, IQR={IQR}, Upper={Upper}, Lower={Lower},M={M} ") plt.figure(dpi=120) plt.boxplot(N,meanline=True,showmeans=True) plt.yticks([0,Lower,Q0,Q1,M,Q2,Q3,Q4,Upper],['0','Lower','Q0','Q1','M','Q2','Q3','Q4','Upper']) plt.grid(axis='y')
N = [0,1,3,4,5,9,10,20] Q0 = np.quantile(N,q=0/4) # 最小值 Q1 = np.quantile(N,q=1/4) # 箱子的下边 Q2 = np.quantile(N,q=2/4) # 箱子的中位数线 Q3 = np.quantile(N,q=3/4) # 箱子的上边 Q4 = np.quantile(N,q=4/4) # 最大值 M = np.mean(N) # 均值 IQR = Q3-Q1 # 箱子的长度 Upper = Q3 + 1.5*IQR # 箱线图的上限 (限制,如果值超过这个限度,就取这个限度) Lower = Q1 - 1.5*IQR # 箱线图的下限 (限制,如果值不超过这个限度,就取不超限的最值) print(f"Q3={Q3}, Q1={Q1}, IQR={IQR}, Upper={Upper}, Lower={Lower},M={M} ") plt.boxplot(N,showmeans=True) plt.yticks([0,Lower,Q0,Q1,M,Q2,Q3,Q4,Upper]) plt.grid(axis='y')
直接使用sns和plt绘制
plt.subplot(121) sns.boxplot(df["PROFIT"].values,showfliers=False) plt.subplot(122) plt.boxplot(df['PROFIT'],showfliers=False)
数据库分析实际案例
import pymysql import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = 'KaiTi' plt.rcParams['axes.unicode_minus'] = False # 连接数据库 db = pymysql.connect(host='172.19.21.249',user='root',password='root',database='testdb') # 构造sql查询 sql = "select OPERATOR 销售人员, PRICE 销售额 FROM orders where FY='2019'" # 执行sql查询获取结果 df = pd.read_sql_query(sql,db) operators = df['销售人员'].unique() boxes = [] for op in operators: boxes.append(df[df['销售人员']==op]['销售额']) plt.boxplot(boxes, labels=operators, showfliers=False,showmeans=True) counts = df.groupby('销售人员').count() plt.plot(np.arange(1,counts.shape[0]+1),counts) plt.show()
总结
通过这么多的案例,我们应该明确到线形图绘制的基本语法有哪些。如何直接通过数据源就可以对其进行可视化,一般来说,线形图的用处主要是用来发掘异常值和异常点的,在科研统计中用的比较多。