【导语】有时候有些事情,我们无法用言语清晰的表达,我们可以通过图表。文不如表,表不如图。所以,可视化是数据分析中最重要的任务之一。python中有很多可视化的工具包,这篇文章主要围绕Matplotlib,需要的小伙伴可以做个参考。
Matplotlib官方定义:Matplotlib是一个综合库,用于在Python中创建静态,动画和交互式可视化。
学习内容:
1、用哪些图表达哪些数据(如何选择绘图类型)
2、如何用Matplotlib诠释一些常用的绘图类型
根据业务数据、选择合适的图表画图
① 趋势变化
折线图(大多数情况下,x轴都是时间序列)
使用场景:反映在一段时间内,事物的变化趋势
实现方法:plt.plot(x, y, linewidth, color)
导入相关包,测试数据是阿里的双十二用户行为,绘制按天的pv和uv用户浏览量的折线图。
import pandas as pd
import numpy as np
import datetime
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.family'] = 'SimHei'
import warnings
warnings.filterwarnings("ignore")
# 不同的样式可用于渲染绘图
plt.style.available
plt.style.use('seaborn')
data_user=pd.read_csv(r'.\mobile_recommend_train_user.csv')
data_user['date'] = data_user['time'].apply(lambda s: s.split()[0])
data_user['hour'] = data_user['time'].apply(lambda s: s.split()[1])
data_user['date'] = pd.to_datetime(data_user['date'])
data_user['time'] = pd.to_datetime(data_user['time'])
data_user['hour'] = data_user['hour'].astype('int64')
data_user = data_user.sort_values(by='time', ascending=True)
data_user=data_user.reset_index(drop=True)
pv_daily = data_user.groupby('date')['user_id'].count().reset_index().rename(columns = {'user_id':'pv'})
uv_daily = data_user.groupby('date')['user_id'].nunique().reset_index().rename(columns = {'user_id':'uv'})
plt.figure(figsize=(20, 12), dpi=80)
plt.subplot(221)
plt.plot(pv_daily['date'], pv_daily['pv'],linewidth=4)
plt.xticks(rotation=45)
plt.axvspan('2014-12-10', '2014-12-12', color='#EE7621', alpha=0.3)
plt.title("PV页面浏览量/天",color='#4A708B',fontsize=24)
plt.ylabel("数量")
plt.subplot(222)
plt.plot(uv_daily['date'], uv_daily['uv'], linewidth=4, color = '#EE7621')
plt.xticks(rotation=45)
plt.axvline('2014-12-12', color='#4A708B', linestyle='--',linewidth=1)
plt.axhline(6800, color='#4A708B', linestyle='--',linewidth=1)
plt.title("UV页面浏览量/天",color='#4A708B',fontsize=24)
plt.show()
图表说明:双十二期间,pv和uv访问量达到峰值,并且可以发现,uv和pv两个访问量数值差距比较大,同时,因为数据集总人数大约是10000人左右,因此,通过uv值可以分析出双十二期间淘宝用户的日活跃大概是45%浮动。
②关联关系
散点图(观察数据离散程度)
使用场景:①包含至少两个连续变量②查看变量之间的关系
实现方法:plt.scatter(x,y,s,c,marker,alpha,linewidths)
测试数据是饭店的综合评分,综合评分,口味评分,环境评分,服务评分,人均价格,绘制散点图,观察人均价格和分别对口味评分、环境评分、服务评分的关系。
data = pd.read_csv('C:/Users/cherich/Desktop/datas/foods.csv',encoding='gbk')
data.dropna(inplace=True)
plt.figure(figsize=(20, 12), dpi=80)
x = data.per_money.tolist()
y = data.taste.tolist()
z = data.envirment.tolist()
h = data.service.tolist()
plt.subplot(221)
plt.scatter(y,x,c = '#EE7621',marker='v',label="价格和口味",alpha=0.8)
plt.legend(loc='best')
plt.subplot(222)
plt.scatter(z,x,c = '#EE7621',marker='o', label="价格和环境",alpha=0.8)
plt.legend(loc='best')
plt.subplot(223)
plt.scatter(h,x,c = '#EE7621',marker=',', label="价格和服务",alpha=0.8)
plt.legend(loc=2)
plt.show()
图表说明:通过观察散点的离散程度,人均价格和服务、环境的相关性更大一些。
相关性热力图
使用场景:观察两个或两个以上的变量之间是否存在关联关系
实现方法:sns.heatmap(data.corr(),linewidths, annot,cmap)
import seaborn as sns
data = data.drop(columns=['ID'])
plt.figure(figsize=(10, 8))
key_list = ['per_money','taste','envirment','service']
sns.heatmap(data.corr(),linewidths=0.1, annot=True,cmap='YlGn')
plt.xticks(fontsize=13)
plt.yticks(fontsize=13)
plt.show()
图表说明:通过热力图颜色的渐变程度,在影响综合评分的因素中,环境评分和口味评分呈现高度相关,人均价格呈现中度相关,人均价格则呈现极低的相关性。
③分类对比
条形图
使用场景:比较每个类别的高低大小,对每个分类进行计算
实现方法:plt.bar(x,height,width,color)
groups = data.groupby('city')
x = [each[0] for each in groups]
y = [each[1].per_money.mean() for each in groups]
fig = plt.figure(figsize=(10,8),dpi=80)
plt.title('各个城市餐饮平均消费水平',color='#4A708B',fontsize=24)
plt.xlabel('城市')
plt.ylabel('价格(元)')
ax = fig.add_subplot(111)
colors = ['#4F4F4F','#4A708B','#A52A2A','#DAA520','#EE7621','#FFEC8B']
for i, group_name in enumerate(groups):
lin1 = ax.bar(group_name[0], group_name[1].per_money.mean(),width=0.5,color=colors[i])
for rect in lin1:
height = rect.get_height()
plt.text(rect.get_x()+rect.get_width()/2, height+0.3, str(round(height,2)),ha="center",
fontsize=12)
ax2 = ax.twinx()
lin2 = ax2.plot(x,y,label='趋势线',color = 'g',marker='o',
linestyle='dashed', linewidth=1,alpha=0.3)
ax2.legend(loc='best')
plt.grid()
plt.show()
饼图
使用场景:拥有一个分类变量,需要对每个分类进行百分比
实现方法:plt.pie(x,lables,autopct,shadow,startangle,colors,explode)
food_type = data.groupby('city').size()
plt.figure(figsize=(10,8),dpi=80)
explodes= [0,0,0,0,0.2,0.1]
size = 0.3
plt.pie(food_type, labels=food_type.index, autopct='%.2f%%',
shadow=True, startangle=80,explode=explodes,colors=['#4F4F4F','#4A708B','#A52A2A','#DAA520','#EE7621','#FFEC8B'])
plt.legend(food_type.index,bbox_to_anchor=(1.5, 1.0))
plt.show()
④分布规律
直方图
使用场景:数据是单一的连续变量,展示数据分布情况
实现方法:plt.hist(data,bins,color)
plt.figure(figsize=(8,6),dpi=80)
plt.title('总体消费水平分布图',color='#4A708B',fontsize=24)
plt.hist(data.per_money,bins=7,color='#DAA520',alpha=0.7)
plt.ylabel('数量(个)')
plt.xlabel('价格(元)')
plt.show()
箱型图
使用场景:分析一组数据的离散分布情况,检查是否存在异常值
实现方法:plt.boxplot([box_1],patch_artist , boxprops ,labels)
money= data['per_money'].groupby(data['city'])
plt.figure(figsize=(18, 12), dpi=80)
box_1, box_2, box_3, box_4,box_5, box_6 = money.get_group('北京'),money.get_group('上海'),money.get_group('广州'),money.get_group('成都'),money.get_group('沈阳'),money.get_group('深圳')
plt.title('各个城市的消费水平',color='#CD6090',fontsize=24)
labels = '北京','上海','广州','成都','沈阳','深圳'
bplot = plt.boxplot([box_1, box_2, box_3, box_4,box_5,box_6],patch_artist = True,showmeans=True,labels=labels)
colors = ['#4F4F4F','#4A708B','#A52A2A','#DAA520','#EE7621','#FFEC8B']
for patch, color in zip(bplot['boxes'], colors):
patch.set_facecolor(color)
plt.ylabel('价格(元)',fontsize = 16)
plt.show()
词云图
使用场景:从大量数据中提取关键信息
实现方法:wordcloud
from wordcloud import WordCloud
li = [each for each in data['type'].values]
def func_pd(words):
count_result = pd.Series(words).value_counts()
return count_result.to_dict()
frequencies = func_pd(li)
plt.figure(figsize = (10,8),dpi=80)
wordcloud = WordCloud(font_path="STSONG.TTF",background_color='white', width=700,height=350).fit_words(frequencies)
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
四、总结
本篇文章主要归纳了Matplotlib的绘图方法,具体的使用还是要结合我们的业务数据。那么在企业中,可视化不仅仅能展现数据规律,挖掘有价值的信息;还可以监测数据异常指标;为建模提供一些想法,做一些预测等。
希望本文的内容对大家的学习或者工作能带来一定的帮助,每天进步一点点,加油。
网友评论