美文网首页数据中台
数据可视化之如何用Matplotlib画好看的图

数据可视化之如何用Matplotlib画好看的图

作者: python与数据分析 | 来源:发表于2020-12-31 16:33 被阅读0次

    【导语】有时候有些事情,我们无法用言语清晰的表达,我们可以通过图表。文不如表,表不如图。所以,可视化是数据分析中最重要的任务之一。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的绘图方法,具体的使用还是要结合我们的业务数据。那么在企业中,可视化不仅仅能展现数据规律,挖掘有价值的信息;还可以监测数据异常指标;为建模提供一些想法,做一些预测等。

    希望本文的内容对大家的学习或者工作能带来一定的帮助,每天进步一点点,加油。

    相关文章

      网友评论

        本文标题:数据可视化之如何用Matplotlib画好看的图

        本文链接:https://www.haomeiwen.com/subject/utdloktx.html