数据可视化实例(八): 边缘直方图(matplotlib,pandas)

https://datawhalechina.github.io/pms50/#/chapter6/chapter6

边缘直方图 (Marginal Histogram)

边缘直方图具有沿 X 和 Y 轴变量的直方图。 这用于可视化 X 和 Y 之间的关系以及单独的 X 和 Y 的单变量分布。 这种图经常用于探索性数据分析(EDA)。

导入所需要的库

# 导入numpy库
import numpy as np
# 导入pandas库
import pandas as pd
# 导入matplotlib库
import matplotlib as mpl
import matplotlib.pyplot as plt
# 导入seaborn库
import seaborn as sns
# 在jupyter notebook显示图像
%matplotlib inline

设定图像各种属性

large = 22; med = 16; small = 12
            # 设置子图上的标题字体
params = {'axes.titlesize': large,  
            # 设置图例的字体
          'legend.fontsize': med,
            # 设置图像的画布
          'figure.figsize': (16, 10),  
            # 设置标签的字体
          'axes.labelsize': med, 
            # 设置x轴上的标尺的字体
          'xtick.labelsize': med,  
            # 设置整个画布的标题字体
          'ytick.labelsize': med,  
          'figure.titlesize': large}  
# 更新默认属性
plt.rcParams.update(params)  
 # 设定整体风格
plt.style.use('seaborn-whitegrid')
# 设定整体背景风格
sns.set_style("white")  

程序代码

# step1:导入数据

df = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/mpg_ggplot2.csv")

# step2:创建子图对象与网格

    # 画布

fig = plt.figure(figsize = (16, 10),     # 画布大小_(16, 10)
                 dpi = 80,               # 分辨率
                 facecolor = 'white')    # 背景颜色,默认为白色
    # 网格

grid = plt.GridSpec(4,                   # 行数 
                    4,                   # 列数
                    hspace = 0.5,        # 行与行之间的间隔
                    wspace = 0.2)        # 列与列之间的间隔

# step3:明确子图的位置

    # 确定如图所示散点图的位置
ax_main = fig.add_subplot(grid[:-1, :-1])
    # 确定如图所示右边直方图的位置
ax_right = fig.add_subplot(grid[:-1, -1], xticklabels = [], yticklabels = [])
    # 确定如图所示最底下直方图的位置
ax_bottom = fig.add_subplot(grid[-1, 0:-1], xticklabels = [], yticklabels = [])

# step4:散点图

    # category__Category是pandas的一种数据类型
    # astype__实现变量类型转换
    # cat__获取分类变量的类别
    # codes__按照类别编码
ax_main.scatter('displ',             # 横坐标
               'hwy',                # 纵坐标
                s = df.cty*4,        # 设置点的尺寸
               data = df,            # 所使用的数据
               c = df.manufacturer.astype('category').cat.codes,   # 颜色类别
                cmap = 'tab10',      # 调色板
                edgecolors = 'gray', # 边框颜色
                linewidths = 0.5,    # 线宽
                alpha = 0.9)          # 透明度

# step5:右边的直方图

ax_right.hist(df.hwy,                 # 需要绘图的变量
             40,                      # 需要分为多少段
             histtype = 'stepfilled', # 生成一个的线条轮廓
             orientation = 'horizontal',  # 方位__水平
             color = 'deeppink')      # 颜色__深粉色

# step6:底部的直方图

ax_bottom.hist(df.displ,                # 需要绘图的变量
              40,                       # 需要分为多少段
              histtype = 'stepfilled',  # 生成一个的线条轮廓
              orientation = 'vertical', # 方位__垂直
              color = 'deeppink')       # 颜色__深粉色
ax_bottom.invert_yaxis()

# step7:装饰图像

ax_main.set(title='Scatterplot with Histograms \n displ vs hwy',  # 设置标题
            xlabel='displ',             # 横坐标名称
            ylabel='hwy')               # 纵坐标名称
ax_main.title.set_fontsize(20)          # 设置标题字体大小
    # xaxis.label__x坐标轴的标题
    # yaxis.label__y坐标轴的标题
    # xticklabel__x坐标轴的标尺
    # yticklabel__y坐标轴的标尺
        # 遍历每一个对象并且修改其字体大小
for item in ([ax_main.xaxis.label, ax_main.yaxis.label] + ax_main.get_xticklabels() + ax_main.get_yticklabels()):
    item.set_fontsize(14)               # 修改字体大小

xlabels = ax_main.get_xticks().tolist() # 将散点图上的x坐标轴上的标尺提取后转换为list(一位小数)
ax_main.set_xticklabels(xlabels)        # 将xlabels中的数字设置为散点图上的坐标轴上的标尺
plt.show()                              # 显示图像

 

博文总结

matplotlib.pyplot.hist(x,bins=None,range=None, density=None, bottom=None, histtype='bar', align='mid', 
log=False, color=None, label=None, stacked=False, normed=None)

关键参数

x: 数据集,最终的直方图将对数据集进行统计
bins: 统计的区间分布
range: tuple, 显示的区间,range在没有给出bins时生效
density: bool,默认为false,显示的是频数统计结果,为True则显示频率统计结果,这里需要注意,频率统计结果=区间数目/(总数*区间宽度),和normed效果一致,官方推荐使用density
histtype: 可选{'bar', 'barstacked', 'step', 'stepfilled'}之一,默认为bar,推荐使用默认配置,step使用的是梯状,stepfilled则会对梯状内部进行填充,效果与bar类似
align: 可选{'left', 'mid', 'right'}之一,默认为'mid',控制柱状图的水平分布,left或者right,会有部分空白区域,推荐使用默认
log: bool,默认False,即y坐标轴是否选择指数刻度
stacked: bool,默认为False,是否为堆积状图

 

posted @ 2020-05-12 16:32  秋华  阅读(1821)  评论(0编辑  收藏  举报