Python数据可视化

1.离散型变量的可视化

1.1 饼图

1.1.1 matplotlib模块

下面以"芝麻信用"失信用户数据为例(数据来源于财新网),分析近300万失信人群的学历分布

# 饼图的绘制
# 导入第三方模块
import matplotlib.pyplot as plt
# 构造数据
edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
labels = ['中专','大专','本科','硕士','其他']
# 添加修饰的饼图 
explode = [0,0.1,0,0,0]  # 生成数据,用于突出显示大专学历人群
# 中文乱码和坐标轴负号的处理
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 将横、纵坐标轴标准化处理,确保饼图是一个正圆,否则为椭圆
plt.axes(aspect='equal')
# 设置图片风格
plt.style.use("ggplot")
# 设置画布大小
plt.figure(figsize=(6,6))
# 绘制饼图
plt.pie(x = edu, # 绘图数据
        explode=explode, # 突出显示大专人群
        labels=labels, # 添加教育水平标签
        autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数
        pctdistance=0.8,  # 设置百分比标签与圆心的距离
        labeldistance = 1.1, # 设置教育水平标签与圆心的距离
        startangle = 180, # 设置饼图的初始角度
        radius = 1.2, # 设置饼图的半径
        counterclock = False, # 是否逆时针,这里设置为顺时针方向
        textprops = {'fontsize':12, 'color':'black'}, # 设置文本标签的属性值
        )

# 添加图标题
plt.title('失信用户的受教育水平分布')
# 保存图片
plt.savefig("./图片1")
# 显示图形
plt.show()

Python数据可视化_第1张图片

1.1.2 pandas模块
# 导入第三方模块
import pandas as pd
# 构建序列
data1 = pd.Series({'中专':0.2515,'大专':0.3724,'本科':0.3336,'硕士':0.0368,'其他':0.0057})
# 将序列的名称设置为空字符,否则绘制的饼图左边会出现None这样的字眼
data1.name = ''
# 控制饼图为正圆
plt.axes(aspect = 'equal')
# 设置画布大小
plt.figure(figsize=(6,6))
# plot方法对序列进行绘图
data1.plot(kind = 'pie', # 选择图形类型
           explode=[0,0,0.08,0,0],
           autopct='%.1f%%', # 饼图中添加数值标签
           radius = 1, # 设置饼图的半径
           startangle = 180, # 设置饼图的初始角度
           counterclock = False, # 将饼图的顺序设置为顺时针方向
           title = '失信用户的受教育水平分布', # 为饼图添加标题
           textprops = {'fontsize':12, 'color':'black'} # 设置文本标签的属性值
          )
# 保存图片
plt.savefig("./图片2")
# 显示图形
plt.show()

Python数据可视化_第2张图片

1.2 条形图

1.2.1 matplotlib模块

首先绘制单个离散变量的垂直或水平条形图,数据来源于互联网,反应的是2017年中国六大省份的GDP,代码如下:

# 条形图的绘制--垂直条形图
# 读入数据
GDP = pd.read_excel(r'./Province GDP 2017.xlsx')
GDP

Python数据可视化_第3张图片

# 设置绘图风格(不妨使用R语言中的ggplot2风格)
plt.style.use('ggplot')
plt.figure(figsize=(10,6))
# 绘制条形图
plt.bar(left = range(GDP.shape[0]), # 指定条形图x轴的刻度值
        height = GDP.GDP, # 指定条形图y轴的数值
        tick_label = GDP.Province, # 指定条形图x轴的刻度标签
        color = 'steelblue', # 指定条形图的填充色
       )
# 添加y轴的标签
plt.ylabel('GDP(万亿)')
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
# 添加条形图的标题
plt.title('2017年度6个省份GDP分布',fontsize=16)
# 为每个条形图添加数值标签
for x,y in enumerate(GDP.GDP):
    plt.text(x,y+0.1,'%s' %round(y,1),ha='center',fontsize=14)
plt.savefig("./图片3")
# 显示图形    
plt.show()

Python数据可视化_第4张图片
将条形图进行升序或降序处理,以水平条形图为例:

# 条形图的绘制--水平条形图
# 对读入的数据作升序排序
GDP.sort_values(by = 'GDP', inplace = True)
plt.figure(figsize=(10,6))
# 绘制条形图
plt.barh(bottom = range(GDP.shape[0]), # 指定条形图y轴的刻度值
        width = GDP.GDP, # 指定条形图x轴的数值
        tick_label = GDP.Province, # 指定条形图y轴的刻度标签
        color = 'steelblue', # 指定条形图的填充色
       )
# 添加x轴的标签
plt.xlabel('GDP(万亿)')
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
# 添加条形图的标题
plt.title('2017年度6个省份GDP分布')
# 为每个条形图添加数值标签
for y,x in enumerate(GDP.GDP):
    plt.text(x+0.1,y,x,va='center',fontsize=12)
plt.savefig("./图片4")
# 显示图形    
plt.show()

Python数据可视化_第5张图片
绘制堆叠条形图
这里以2017年四个季度的产业值为例(数据来源于中国统计局)

# 读入数据
Industry_GDP = pd.read_excel(r'./Industry_GDP.xlsx')
Industry_GDP

Python数据可视化_第6张图片

# 取出四个不同的季度标签,用作堆叠条形图x轴的刻度标签
Quarters = Industry_GDP.Quarter.unique()
plt.figure(figsize=(10,6))
# 取出第一产业的四季度值
Industry1 = Industry_GDP.GPD[Industry_GDP.Industry_Type == '第一产业']
# 重新设置行索引
Industry1.index = range(len(Quarters))
# 取出第二产业的四季度值
Industry2 = Industry_GDP.GPD[Industry_GDP.Industry_Type == '第二产业']
# 重新设置行索引
Industry2.index = range(len(Quarters))
# 取出第三产业的四季度值
Industry3 = Industry_GDP.GPD[Industry_GDP.Industry_Type == '第三产业']

# 绘制堆叠条形图
# 各季度下第一产业的条形图
plt.bar(left = range(len(Quarters)), height=Industry1, label = '第一产业', tick_label = Quarters,width=0.6)
# 各季度下第二产业的条形图
plt.bar(left = range(len(Quarters)), height=Industry2, bottom = Industry1, label = '第二产业',width=0.6)
# 各季度下第三产业的条形图
plt.bar(left = range(len(Quarters)), height=Industry3, bottom = Industry1  + Industry2, label = '第三产业',width=0.6)
# 添加y轴标签
plt.ylabel('生成总值(亿)',fontsize=14)
# 添加图形标题
plt.title('2017年各季度三产业总值',fontsize=16)
# 显示各产业的图例
plt.legend(fontsize=12)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.savefig("./图片5")
# 显示图形
plt.show()

Python数据可视化_第7张图片
需要注意的是,第二产业的条形图是在第一产业的基础上做了叠加,所以需要将bottom参数设置为Industry1;后面同理.
还有一点需要注意,产业值取出来后需要重置索引,这样才能计算Industry1和Industry2的和.

水平交错条形图

# 导入第三方模块
import numpy as np
# 读入数据
HuRun = pd.read_excel(r'./hurun.xlsx')
# 取出城市名称
Cities = HuRun.City.unique()
# 取出2016年各城市亿万资产家庭数
Counts2016 = HuRun.Counts[HuRun.Year == 2016]
# 取出2017年各城市亿万资产家庭数
Counts2017 = HuRun.Counts[HuRun.Year == 2017]
plt.figure(figsize=(10,6))
# 绘制水平交错条形图
plt.bar(left = np.arange(len(Cities)), height = Counts2016, label = '2016', width = 0.4)
plt.bar(left = np.arange(len(Cities))+0.4, height = Counts2017, label = '2017', width = 0.4)
# 添加刻度标签(向右偏移0.225)
plt.xticks(np.arange(5)+0.2,Cities,fontsize=14)
plt.yticks(fontsize=14)
# 添加y轴标签
plt.ylabel('亿万资产家庭数',fontsize=14)
# 添加图形标题
plt.title('近两年5个城市亿万资产家庭数比较',fontsize=16)
# 添加图例
plt.legend(fontsize=14)
plt.savefig("./图片6")
# 显示图形
plt.show()

Python数据可视化_第8张图片

1.2.2 pandas模块

绘制单个离散变量的条形图

# 绘图(此时的数据集在前文已经按各省GDP做过升序处理)
plt.figure(figsize=(10,6))
GDP.GDP.plot(kind = 'bar', width = 0.7, rot = 0)
plt.title('2017年度6个省份GDP分布',fontsize=16)
# 添加y轴标签
plt.ylabel('GDP(万亿)',fontsize=14)
# 添加x轴刻度标签
plt.xticks(range(len(GDP.Province)), #指定刻度标签的位置  
           GDP.Province, # 指出具体的刻度标签值
           fontsize=14
          )
# 为每个条形图添加数值标签
for x,y in enumerate(GDP.GDP):
    plt.text(x-0.1,y+0.2,'%s' %round(y,1),va='center',fontsize=13)
plt.savefig("./图片7")
# 显示图形
plt.show()

Python数据可视化_第9张图片
绘制含两个离散变量的水平交错条形图

# Pandas模块之水平交错条形图
HuRun_reshape = HuRun.pivot_table(index = 'City', columns='Year', values='Counts').reset_index()
# 对数据集降序排序
HuRun_reshape.sort_values(by = 2016, ascending = False, inplace = True)
HuRun_reshape.plot(x = 'City', y = [2016,2017], kind = 'bar',
                   rot = 0, # 用于旋转x轴刻度标签的角度,0表示水平显示刻度标签
                   width = 0.8,figsize=(10,6),fontsize=14)
# 添加y轴标签
plt.title('近两年5个城市亿万资产家庭数比较',fontsize=18)
plt.ylabel('亿万资产家庭数')
plt.xlabel('')
plt.legend(fontsize=14)
plt.savefig('./图片8')
plt.show()

Python数据可视化_第10张图片
应用plot方法绘制水平交错条形图,必须更改原始数据集的形状.

1.2.3 seaborn模块绘制条形图
# seaborn模块之垂直或水平条形图
# 导入第三方模块
import seaborn as sns
plt.figure(figsize=(10,6))
sns.barplot(y = 'Province', # 指定条形图x轴的数据
            x = 'GDP', # 指定条形图y轴的数据
            data = GDP, # 指定需要绘图的数据集
           )
# 重新设置x轴和y轴的标签
plt.xlabel('GDP(万亿)')
plt.ylabel('')
# 添加图形的标题
plt.title('2017年度6个省份GDP分布',fontsize=16)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
# 为每个条形图添加数值标签
for y,x in enumerate(GDP.GDP):
    plt.text(x,y,'%s' %round(x,1),va='center',fontsize=14)
# 显示图形
plt.savefig('./图片9')
plt.show()

Python数据可视化_第11张图片
除此之外,seaborn模块中的barplot函数还可以绘制两个离散变量的水平交错条形图

# 读入数据
Titanic = pd.read_csv(r'./titanic_train.csv')
Titanic.head()

Python数据可视化_第12张图片

plt.figure(figsize=(10,6))
# 绘制水平交错条形图
sns.barplot(x = 'Pclass', # 指定x轴数据
            y = 'Age', # 指定y轴数据
            hue = 'Sex', # 指定分组数据
            data = Titanic, # 指定绘图数据集
            palette = 'RdBu', # 指定男女性别的不同颜色
            errcolor = 'blue', # 指定误差棒的颜色
            errwidth=2, # 指定误差棒的线宽
            saturation = 1, # 指定颜色的透明度,这里设置为无透明度
            capsize = 0.05, # 指定误差棒两端线条的宽度
           )
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
# 添加图形标题
plt.title('各船舱等级中男女乘客的年龄差异',fontsize=18)
plt.savefig("./图片9")
# 显示图形
plt.show()

Python数据可视化_第13张图片
绘制的每一个条形图中都含有一条竖线,该竖线就是条形图的误差棒,即个组别下年龄的标准差大小,由上图可知,三等舱男性乘客年龄是最为接近的,因为标准差最小.

2 数值型变量可视化

2.1 直方图与核密度曲线

2.1.1 matplotlib模块
# matplotlib模块绘制直方图
# 检查年龄是否有缺失
any(Titanic.Age.isnull())
# 不妨删除含有缺失年龄的观察
Titanic.dropna(subset=['Age'], inplace=True)
plt.figure(figsize=(10,6))
# 绘制直方图
plt.hist(x = Titanic.Age, # 指定绘图数据
         bins = 20, # 指定直方图中条块的个数
         color = 'steelblue', # 指定直方图的填充色
         edgecolor = 'black' # 指定直方图的边框色
         )
# 添加x轴和y轴标签
plt.xlabel('年龄',fontsize=14)
plt.ylabel('频数',fontsize=14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
# 添加标题
plt.title('乘客年龄分布',fontsize=18)
plt.savefig('./图片10')
# 显示图形
plt.show()

Python数据可视化_第14张图片
any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。
需要注意的是,如果原始数据集中存在缺失值,一定要对缺失观测进行删除或替换,否则无法绘制成功。

2.1.2 pandas模块
# Pandas模块绘制直方图和核密度图
# 绘制直方图
Titanic.Age.plot(kind = 'hist', bins = 20, color = 'steelblue',
                 edgecolor = 'black', normed = True, label = '直方图',figsize=(10,6),fontsize=14)
# 绘制核密度图
Titanic.Age.plot(kind = 'kde', color = 'red', label = '核密度图')
# 添加x轴和y轴标签
plt.xlabel('年龄',fontsize=14)
plt.ylabel('核密度值',fontsize=14)
# 添加标题
plt.title('乘客年龄分布',fontsize=18)
# 显示图例
plt.legend()
plt.savefig('./图片11')
# 显示图形
plt.show()

Python数据可视化_第15张图片

2.1.3 seaborn模块

尽管上图满足了两种图形的合并,但其表达的是所有乘客的年龄分布,如果按性别分组,研究不同性别下的年龄分布差异,这时候推荐使用seaborn模块中的distplot函数

# seaborn模块绘制分组的直方图和核密度图
# 取出男性年龄
Age_Male = Titanic.Age[Titanic.Sex == 'male']
# 取出女性年龄
Age_Female = Titanic.Age[Titanic.Sex == 'female']
plt.figure(figsize=(10,6))
# 绘制男女乘客年龄的直方图
sns.distplot(Age_Male, bins = 20, kde = False, hist_kws = {'color':'steelblue'}, label = '男性')
# 绘制女性年龄的直方图
sns.distplot(Age_Female, bins = 20, kde = False, hist_kws = {'color':'purple'}, label = '女性')
plt.title('男女乘客的年龄直方图',fontsize=18)
# 显示图例
plt.legend(fontsize=14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
# 显示图形
plt.savefig('./图片12')
plt.show()
plt.figure(figsize=(10,6))
# 绘制男女乘客年龄的核密度图
sns.distplot(Age_Male, hist = False, kde_kws = {'color':'red', 'linestyle':'-'}, 
             norm_hist = True, label = '男性')
# 绘制女性年龄的核密度图
sns.distplot(Age_Female, hist = False, kde_kws = {'color':'black', 'linestyle':'--'}, 
             norm_hist = True, label = '女性')
plt.title('男女乘客的年龄核密度图',fontsize=18)
# 显示图例
plt.legend(fontsize=14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.savefig('./图片13')
# 显示图形
plt.show()

Python数据可视化_第16张图片
Python数据可视化_第17张图片
为了避免四个图形混在一起不易发现数据背后的特征,将直方图与核密度图分开绘制.
从直方图来看,女性年龄的分布明显比男性矮,说明在个年龄段下,男性乘客要比女性乘客多;再看核密度图,男女性别的年龄分布比较接近,说明各年龄段下的男女乘客人数同步增加或减少.

2.2 箱线图

2.2.1 matplotlib模块

关于箱线图的含义可以参考:https://www.cnblogs.com/wyy1480/p/9526264.html

# 读取数据
Sec_Buildings = pd.read_excel(r'./sec_buildings.xlsx')
Sec_Buildings.head()

Python数据可视化_第18张图片

# 绘制箱线图
plt.boxplot(x = Sec_Buildings.price_unit, # 指定绘图数据
            patch_artist=True, # 要求用自定义颜色填充盒形图,默认白色填充
            showmeans=True, # 以点的形式显示均值
            boxprops = {'color':'black','facecolor':'steelblue'}, # 设置箱体属性,如边框色和填充色
            # 设置异常点属性,如点的形状、填充色和点的大小
            flierprops = {'marker':'o','markerfacecolor':'red', 'markersize':3}, 
            # 设置均值点的属性,如点的形状、填充色和点的大小
            meanprops = {'marker':'D','markerfacecolor':'indianred', 'markersize':4}, 
            # 设置中位数线的属性,如线的类型和颜色
            medianprops = {'linestyle':'--','color':'orange'}, 
            labels = [''] # 删除x轴的刻度标签,否则图形显示刻度标签为1
           )
# 添加图形标题
plt.title('二手房单价分布的箱线图',fontsize=18)
plt.yticks(fontsize=14)
plt.ylabel('单价(元)',fontsize=14)
plt.savefig('./图片14')
# 显示图形
plt.show()

Python数据可视化_第19张图片

# 二手房在各行政区域的平均单价
group_region = Sec_Buildings.groupby('region')
avg_price = group_region.aggregate({'price_unit':np.mean}).sort_values('price_unit', ascending = False)

# 通过循环,将不同行政区域的二手房存储到列表中
region_price = []
for region in avg_price.index:
    region_price.append(Sec_Buildings.price_unit[Sec_Buildings.region == region])
plt.figure(figsize=(10,6))
# 绘制分组箱线图
plt.boxplot(x = region_price, 
            patch_artist=True,
            labels = avg_price.index, # 添加x轴的刻度标签
            showmeans=True, 
            boxprops = {'color':'black', 'facecolor':'steelblue'}, 
            flierprops = {'marker':'o','markerfacecolor':'red', 'markersize':3}, 
            meanprops = {'marker':'D','markerfacecolor':'indianred', 'markersize':4},
            medianprops = {'linestyle':'--','color':'orange'}
           )
# 添加y轴标签
plt.ylabel('单价(元)')
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
# 添加标题
plt.title('不同行政区域的二手房单价对比',fontsize=18)
plt.savefig('./图片15')
# 显示图形
plt.show()

Python数据可视化_第20张图片

2.2.2 seaborn模块
plt.figure(figsize=(10,6))
# 绘制分组箱线图
sns.boxplot(x = 'region', y = 'price_unit', data = Sec_Buildings, 
            order = avg_price.index, showmeans=True,color = 'steelblue',
            flierprops = {'marker':'o','markerfacecolor':'red', 'markersize':3}, 
            meanprops = {'marker':'D','markerfacecolor':'indianred', 'markersize':4},
            medianprops = {'linestyle':'--','color':'orange'}
           )
# 更改x轴和y轴标签
plt.xlabel('')
plt.ylabel('单价(元)')
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
# 添加标题
plt.title('不同行政区域的二手房单价对比',fontsize=18)
# 显示图形
plt.show()

通过如上代码,可以得到完全一致的分组箱线图

2.3 小提琴图

# 读取数据
tips = pd.read_csv(r'./tips.csv')
tips.head()

Python数据可视化_第21张图片

plt.figure(figsize=(10,6))
# 绘制分组小提琴图
sns.violinplot(x = "day", # 指定x轴的数据
               y = "total_bill", # 指定y轴的数据
               hue = "sex", # 指定分组变量
               data = tips, # 指定绘图的数据集
               order = ['Thur','Fri','Sat','Sun'], # 指定x轴刻度标签的顺序
               scale = 'count', # 以男女客户数调节小提琴图左右的宽度
               split = True, # 将小提琴图从中间割裂开,形成不同的密度曲线;
               palette = 'RdBu' # 指定不同性别对应的颜色(因为hue参数为设置为性别变量)
              )
# 添加图形标题
plt.title('每天不同性别客户的消费额情况',fontsize=18)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
# 设置图例
plt.legend(loc = 'upper center', ncol = 2)
plt.savefig('./图片16')
# 显示图形
plt.show()

Python数据可视化_第22张图片
两边的核密度图代表了不同性别客户的消费额分布,从这张图中,一共可以反应四个维度的信息,y轴表示客户的消费额,x轴表示客户的消费时间,颜色图例表示客户的性别,左右核密度图的宽度代表了样本量,以周五和周六两天为例,周五的男女客户数量差异不大,而周六男性客户比女性客户多得多,因为右半边的核密度图更宽一些

2.4 折线图

2.4.1 matplotlib

以某微信公众号的阅读人数和月度人次为例

# 数据读取
wechat = pd.read_excel(r'./wechat.xlsx')
wechat.head()

Python数据可视化_第23张图片

plt.figure(figsize=(10,6))
# 绘制单条折线图
plt.plot(wechat.Date, # x轴数据
         wechat.Counts, # y轴数据
         linestyle = '-', # 折线类型
         linewidth = 2, # 折线宽度
         color = 'steelblue', # 折线颜色
         marker = 'o', # 折线图中添加圆点
         markersize = 6, # 点的大小
         markeredgecolor='black', # 点的边框色
         markerfacecolor='brown') # 点的填充色
# 添加y轴标签
plt.ylabel('人数',fontsize=14)
plt.xticks(fontsize=12)
plt.yticks(fontsize=14)
# 添加图形标题
plt.title('每天微信文章阅读人数趋势',fontsize=18)
plt.savefig('./图片17')
# 显示图形
plt.show()

Python数据可视化_第24张图片
为进一步改进折线图,还需要解决两个问题

  • 如何将微信文章的阅读人数和阅读人次同时呈现在图中
  • 对于x轴的刻度标签,是否可以只保留月份和日期,并且以7天作为间隔
# 绘制两条折线图
# 导入模块,用于日期刻度的修改
import matplotlib as mpl
plt.figure(figsize=(10,6))
# 绘制阅读人数折线图
plt.plot(wechat.Date, # x轴数据
         wechat.Counts, # y轴数据
         linestyle = '-', # 折线类型,实心线
         color = 'steelblue', # 折线颜色
         label = '阅读人数'
         )
# 绘制阅读人次折线图
plt.plot(wechat.Date, # x轴数据
         wechat.Times, # y轴数据
         linestyle = '--', # 折线类型,虚线
         color = 'indianred', # 折线颜色
         label = '阅读人次'
         )

# 获取图的坐标信息
ax = plt.gca()
# 设置日期的显示格式  
date_format = mpl.dates.DateFormatter("%m-%d")  
ax.xaxis.set_major_formatter(date_format) 
# 设置x轴显示多少个日期刻度
# xlocator = mpl.ticker.LinearLocator(10)该方法可以参考使用
# 设置x轴每个刻度的间隔天数
xlocator = mpl.ticker.MultipleLocator(7)
ax.xaxis.set_major_locator(xlocator)
# 为了避免x轴刻度标签的紧凑,将刻度标签旋转45度
plt.xticks(rotation=45)

# 添加y轴标签
plt.ylabel('人数')
# 添加图形标题
plt.title('每天微信文章阅读人数与人次趋势',fontsize=18)
# 添加图例
plt.legend()
plt.xticks(fontsize=12)
plt.yticks(fontsize=14)
plt.savefig('./图片18')
# 显示图形
plt.show()

Python数据可视化_第25张图片
上面的代码可以分解为两个核心部分:

  • 运用两次plot函数分别绘制阅读人数和阅读人次的折线图,最终通过plt.show()将两条折线图呈现在一张图中
  • 日期型轴刻度的设置,ax变量用来获取原始状态的轴属性,然后基于ax对象修改刻度的显示方式,一个是仅包含月日的格式,另一个是每七天作为一个间隔
2.4.2 pandas
# 读取天气数据
weather = pd.read_excel(r'./weather.xlsx')
weather.head()

Python数据可视化_第26张图片

# 统计每月的平均最高气温
data = weather.pivot_table(index = 'month', columns='year', values='high')

Python数据可视化_第27张图片

# 绘制折线图
data.plot(kind = 'line', 
          style = ['-','--',':'], # 设置折线图的线条类型
          figsize=(10,6)
         )
# 修改x轴和y轴标签
plt.xlabel('月份',fontsize=14)
plt.ylabel('气温',fontsize=14)
# 添加图形标题
plt.title('每月平均最高气温波动趋势',fontsize=18)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.savefig('./图片19')
# 显示图形
plt.show()

Python数据可视化_第28张图片
虽然绘制的核心部分很简单,但是需要提前将原始数据集转换成可以绘制多条折线图的格式,即三条折线图的数据分别为数据框的三个字段

3 关系型数据的可视化

3.1 散点图

3.1.1 matplotlib
# 读入数据
iris = pd.read_csv(r'./iris.csv')
plt.figure(figsize=(10,6))
# 绘制散点图
plt.scatter(x = iris.Petal_Width, # 指定散点图的x轴数据
            y = iris.Petal_Length, # 指定散点图的y轴数据
            color = 'steelblue' # 指定散点图中点的颜色
           )
# 添加x轴和y轴标签
plt.xlabel('花瓣宽度',fontsize=14)
plt.ylabel('花瓣长度',fontsize=14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
# 添加标题
plt.title('鸢尾花的花瓣宽度与长度关系',fontsize=18)
plt.savefig('./图片20')
# 显示图形
plt.show()

Python数据可视化_第29张图片

3.1.2 pandas
# Pandas模块绘制散点图
# 绘制散点图
iris.plot(x = 'Petal_Width', y = 'Petal_Length', kind = 'scatter', figsize=(10,6),fontsize=14)
# 修改x轴和y轴标签
plt.xlabel('花瓣宽度',fontsize=14)
plt.ylabel('花瓣长度',fontsize=14)
# 添加标题
plt.title('鸢尾花的花瓣宽度与长度关系',fontsize=18)
# 显示图形
plt.show()
3.1.3 seaborn

如果绘制分组散点图,建议使用seaborn模块中的lmplot方法

# seaborn模块绘制分组散点图
sns.lmplot(x = 'Petal_Width', # 指定x轴变量
           y = 'Petal_Length', # 指定y轴变量
           hue = 'Species', # 指定分组变量
           data = iris, # 指定绘图数据集
           legend_out = False, # 将图例呈现在图框内
           truncate=True, # 根据实际的数据范围,对拟合线作截断操作
           size=6
          )
# 修改x轴和y轴标签
plt.xlabel('花瓣宽度',fontsize=14)
plt.ylabel('花瓣长度',fontsize=14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
# 添加标题
plt.title('鸢尾花的花瓣宽度与长度关系',fontsize=18)
plt.savefig('./图片21')
# 显示图形
plt.show()

Python数据可视化_第30张图片

3.2 热力图

# 读取数据
Sales = pd.read_excel(r'./Sales.xlsx')
Sales.head()

Python数据可视化_第31张图片

# 根据交易日期,衍生出年份和月份字段
Sales['year'] = Sales.Date.dt.year
Sales['month'] = Sales.Date.dt.month
Sales.head()

Python数据可视化_第32张图片

# 统计每年各月份的销售总额
Summary = Sales.pivot_table(index = 'month', columns = 'year', values = 'Sales', aggfunc = np.sum)

Python数据可视化_第33张图片

plt.figure(figsize=(8,7))
# 绘制热力图
sns.heatmap(data = Summary, # 指定绘图数据
            cmap = 'PuBuGn', # 指定填充色
            linewidths = 0.1, # 设置每个单元格边框的宽度
            annot = True, # 显示数值
            fmt = '.1e', # 以科学计算法显示数据
            )
#添加标题
plt.title('每年各月份销售总额热力图',fontsize=18)
plt.savefig('./图片22')
# 显示图形
plt.show()

Python数据可视化_第34张图片

4 多个图形的合并

# 读取数据
Prod_Trade = pd.read_excel(r'./Prod_Trade.xlsx')
Prod_Trade.head()

Python数据可视化_第35张图片

# 衍生出交易年份和月份字段
Prod_Trade['year'] = Prod_Trade.Date.dt.year
Prod_Trade['month'] = Prod_Trade.Date.dt.month
Prod_Trade.head()

Python数据可视化_第36张图片

# 设置大图框的长和高
plt.figure(figsize = (18,8))
# 设置第一个子图的布局
ax1 = plt.subplot2grid(shape = (2,3), loc = (0,0))
Class_Counts = Prod_Trade.Order_Class[Prod_Trade.year == 2012].value_counts()
Class_Percent = Class_Counts/Class_Counts.sum()
# 将饼图设置为圆形(否则有点像椭圆)
ax1.set_aspect(aspect = 'equal')
# 绘制订单等级饼图
ax1.pie(x = Class_Percent.values, labels = Class_Percent.index, autopct = '%.1f%%')
# 添加标题
ax1.set_title('各等级订单比例')

# 设置第二个子图的布局
ax2 = plt.subplot2grid(shape = (2,3), loc = (0,1))
# 统计2012年每月销售额
Month_Sales = Prod_Trade[Prod_Trade.year == 2012].groupby(by = 'month').aggregate({'Sales':np.sum})
# 绘制销售额趋势图
Month_Sales.plot(title = '2012年各月销售趋势', ax = ax2, legend = False)
# 删除x轴标签
ax2.set_xlabel('')

# 设置第三个子图的布局
ax3 = plt.subplot2grid(shape = (2,3), loc = (0,2), rowspan = 2)
# 绘制各运输方式的成本箱线图
sns.boxplot(x = 'Transport', y = 'Trans_Cost', data = Prod_Trade, ax = ax3)
# 添加标题
ax3.set_title('各运输方式成本分布')
# 删除x轴标签
ax3.set_xlabel('')
# 修改y轴标签
ax3.set_ylabel('运输成本')

# 设置第四个子图的布局
ax4 = plt.subplot2grid(shape = (2,3), loc = (1,0), colspan = 2)
# 2012年客单价分布直方图
sns.distplot(Prod_Trade.Sales[Prod_Trade.year == 2012][Prod_Trade.Sales < 1000], bins = 40, norm_hist = True, ax = ax4, hist_kws = {'color':'steelblue'}, kde_kws={'linestyle':'--', 'color':'red'})
# 添加标题
ax4.set_title('2012年客单价分布图(单价小于1000)')
# 修改x轴标签
ax4.set_xlabel('销售额')

# 调整子图之间的水平间距和高度间距
plt.subplots_adjust(hspace=0.2, wspace=0.2)
plt.savefig('./图片23')
# 图形显示
plt.show()

Python数据可视化_第37张图片
如果为子图添加标题,标签或刻度值,不能直接使用plt.title,plt.xlabel,plt.xticks等函数,而是换成ax1.set_*的形式.

你可能感兴趣的:(数据分析)