Python Matplotlib数据可视化小白入门(2)

重点内容:

  • 数据采集及清理
  • 运用各类图形函数,调用数据绘制对应可视化图表

数据采集

本案例应用的是UCI的华盛顿自行车租赁数据,数据表地址如下:https://archive.ics.uci.edu/ml/datasets/Bike+Sharing+Dataset

对于在线的数据表压缩包,需要在引用代码中制定路径。为避免数据量过大、占用内存资源等问题,通常会定义临时文件夹来存放数据。

import pandas as pd #读取数据到dataframe
import urllib #获取url数据
import tempfile #创建临时文件夹,大量临时数据放在内存中会占用大量资源,可以使用临时文件来进行储存。临时文件不用命名,且使用后会被自动删除
import shutil #文件操作
import zipfile #压缩解压

#获取数据
temp_dir = tempfile.mkdtemp() #建立临时目录,用于下载线上的zip数据表并解压
data_source = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00275/Bike-Sharing-Dataset.zip'
zipname = temp_dir + '/Bike-Sharing-Dataset.zip' #拼接文件和路径
try:
    urllib.urlretrieve(data_source,zipname) #获取数据
except:
    urllib.request.urlretrieve(data_source,zipname)
zip_ref = zipfile.ZipFile(zipname,'r') #创建zipefile对象处理压缩文件
zip_ref.extractall(temp_dir) #解压
zip_ref.close()

#清理数据
daily_path = temp_dir + "/day.csv"
daily_data = pd.read_csv(daily_path) #读取csv
daily_data['dteday']=pd.to_datetime(daily_data['dteday']) #把时间字符串转换为日期格式
drop_list = ['instant','season','yr','mnth','holiday','workingday','weathersit','atemp','hum'] #去掉不关注的列
daily_data.drop(drop_list, inplace =True, axis=1)

shutil.rmtree(temp_dir) #删除临时文件目录

#查看数据
daily_data.head() 

数据表结果如下:


image.png

全局样式参数配置

样式可以做为独立的模块,方便后期对图表全局的样式进行统一配置

import matplotlib
from matplotlib import pyplot as plt
import pandas as pd
import numpy as np
%matplotlib inline

#全局配置图像
#设置图片尺寸
matplotlib.rc('figure',figsize=(14,7)) #rc=resource configuration
#matplotlib.rc('figure',facecolor='red')
#设置全局字体
matplotlib.rc('font',size=14)
#设置背景网格
matplotlib.rc('axes',grid=False)
#设置背景颜色
matplotlib.rc('axes',facecolor='white')

可视化

在了解数据以及数据之间的关系以后,通过不同类型的图表可视化数据之间的关系,说明要表达的内容观点。

用matplotlib实现图表可视化分为两块内容:

  • 配置基础图表函数(模版化)
  • 调用数据赋予给图表,生成根据数据绘制的图表

案例:散点图

  • 配置散点图函数模版
#散点图函数模版,单独列出便于复用
def scatterplot(x_data,y_data,x_label,y_label,title,ax = None):
    if ax:
        pass
    else:
        fig,ax = plt.subplots() #fig,ax是figure和axes的缩写,使用该函数来确定图的位置,fig是图像对象,ax是坐标轴对象
    
    #不显示顶部和右侧的坐标线
    ax.spines['top'].set_color('none')
    ax.spines['right'].set_color('none')
    ax.scatter(x_data,y_data,s=10,color="blue",alpha=0.7)
    
    #添加标题和坐标说明
    ax.set_title(title)
    ax.set_xlabel(x_label)
    ax.set_ylabel(y_label)
  • 调用数据绘制图表
#调用数据绘制图表,观点:表达温度和租车人数的正相关关系
scatterplot(x_data = daily_data['temp'],
           y_data = daily_data['cnt'],
           x_label = 'normalized temperature',
           y_label = 'check outs', #租车量
           title = 'numbers of check outs vs temperature')
image.png

图表函数模版

下面分享一下各类图表的函数模版,具体调用数据部分不再列出
1.双轴曲线图

#双轴曲线图
def lineplot(x_data,x_label,y1_data,y1_label,y1_color,y2_data,y2_label,y2_color,title):
    ax1=plt.subplot() #一个figure里面可以包含多个axes
    ax1.plot(x_data,y1_data,color=y1_color)
    
    ax2=ax1.twinx()#关键函数,表示ax2和ax1共用x轴
    ax2.plot(x_data,y2_data,color=y2_color)
    
    #不显示顶部的坐标线
    ax1.spines['top'].set_color('none')
    ax2.spines['top'].set_color('none')

    #添加标题和坐标说明
    ax1.set_title(title)
    ax1.set_xlabel(x_label)
    ax1.set_ylabel(y1_label)
    ax2.set_ylabel(y2_label)

2.直方图

#直方图
def histoplot(data,x_label,y_label,title):
    _,ax = plt.subplots() # _,多个变量时需使用
    res = ax.hist(data,color = '#539caf',bins=10) #res输出图形的细节值
    ax.set_xlabel(x_label)
    ax.set_ylabel(y_label)
    ax.set_title(title)
    return res

3.堆叠直方图

#堆叠直方图,比较两个数据的分布
def overlaid_histoplot(data1,data1_name,data2,data2_name,x_label,y_label,title):
    max_nbins = 10
    data_range = [min(min(data1),min(data2)),max(max(data1),max(data2))] #对齐两组数据的起止位置
    binwidth = (data_range[1] - data_range[0])/max_nbins
    bins = np.arange(data_range[0],data_range[1]+binwidth,binwidth)
    
    _,ax = plt.subplots()
    ax.hist(data1,bins=bins,color = 'black',alpha=0.7,label=data1_name)
    ax.hist(data2,bins=bins,color ='blue',alpha=0.7,label=data2_name)
    ax.set_xlabel(x_label)
    ax.set_ylabel(y_label)
    ax.set_title(title)
    ax.legend(loc='best')

4.柱状图

#绘制柱状图:数据处理,按照周来查看租车量的分布趋势
mean_data=daily_data[['weekday','cnt']].groupby('weekday').agg([np.mean,np.std])
mean_data.columns = mean_data.columns.droplevel()

#mean_data.head()#查看mean_data的数据

#定义绘制柱状图的函数
def barplot(x_data,y_data,x_label,y_label,title):
    _,ax = plt.subplots()
    
    ax.bar(x_data,y_data,align='center')
    
    ax.set_xlabel(x_label)
    ax.set_ylabel(y_label)
    ax.set_title(title)

barplot(x_data=mean_data.index.values,#为什么不用直接取weekday column?
       y_data=mean_data['mean'],
       x_label='day of weekdays',
       y_label='number of mean check outs',
       title="check outs by day of week")

5.堆积柱状图

#堆积柱状图

#数据处理,按照register和causual来查看不同类别用户的租车量分布趋势
mean_data_by_type =daily_data[['weekday','registered','casual']].groupby('weekday').mean()
mean_data_by_type['total']=mean_data_by_type['registered']+mean_data_by_type['casual']
mean_data_by_type['reg_%']=mean_data_by_type['registered']/mean_data_by_type['total']
mean_data_by_type['cas_%']=mean_data_by_type['casual']/mean_data_by_type['total']

#mean_data_by_type.head()#查看mean_data的数据

#定义堆积柱状图的函数
def stackedbarplot(x_data,x_label,y_data_list,y_data_name,y_label,colors,title):
    _,ax = plt.subplots()
    #循环绘制堆积柱状图
    for i in range(0,len(y_data_list)):
        if i ==0:
            ax.bar(x_data,y_data_list[i],color=colors[i],align='center',label=y_data_name[i])
        else:
            ax.bar(x_data,y_data_list[i],bottom=y_data_list[i-1],color=colors[i],align='center',label=y_data_name[i])
    
    #定义标题和图例
    ax.set_xlabel(x_label)
    ax.set_ylabel(y_label)
    ax.set_title(title)
    ax.legend()

练习

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342