为了方便调用, 把每一种绘制的方法用函数封装起来



"""
    plt.figure(num=1,figsize=(12,8),alpha=0~1) # num是第几张图, figsize定义尺寸,alpha透明度
    plt.add_subplot(1,1,1) # add_subplot(行,列,第几个)
    plt.plot(x,y,color='red',linestyle='',linewidth='',marker='',label='')
    plt.xlabel()
    plt.ylabel("",labelpad=10) # 设置坐标轴的标题; labelpad设置具体的距离/不常用
    
    # 设置坐标的刻度(标签)
    plt.xticks() # xticks(ticks, labels,rotation=45/90) ticks表示刻度值,labels表示该刻度值对应的标签;标签旋转角度
    plt.yticks()
    
    # 设置坐标轴范围; 不常用,系统默认设置了合理的范围
    plt.xlim(0,100)
    plt.ylim(0,1000)
    
    plt.grid(b=True,axis='x/y') # 打开x/y轴的网格, 不设置则默认x,y都打开
    plt.legend() # 打开plot()中设置的label(图例), 默认最佳位置
    plt.title() # 设置标题
    
    # 设置数据标签 text(x,y,str,fontsize) ; x,y是位置, str是显示内容, fontsize是字体大小
    plt.text()


"""


# 1.绘制折线图
def plot_fig():
    """绘制折线图: 适用于 两变量都是连续变量 ; 需要解决的问题就是排序问题"""
    import os
    import matplotlib
    import matplotlib.pyplot as plt
    import pandas as pd

    os.chdir(r'D:\pycharm程序文件\练习1')
    data = pd.read_csv('creditcard_exp.csv', skipinitialspace=True)  # skipinitialspace=True 用于方差分析

    matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

    # 取出两列连续变量画图avg_exp ~ Income
    data_two = data[['Income','avg_exp']].copy()

    # 其中Income作为自变量, 所以将data_two按Income这一列从小到大排序
    new_data_two = data_two.sort_values(by=['Income'],ascending=True)

    # 设置x,y轴
    x = new_data_two['Income']
    y = new_data_two['avg_exp']

    # 绘折线图
    plt.plot(x,y,color='red',linestyle='solid')
    plt.xlabel("年收入/万元")
    plt.ylabel("年信用卡消费/元")
    plt.show()



# 绘制柱状图

def bar_fig():
    """ 柱状图常用于单分类变量,比较其数量"""
    import os
    import matplotlib
    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np

    matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

    os.chdir(r'D:\pycharm程序文件\练习1')
    data = pd.read_excel('data.xlsx')

    # 取出一分类变量; 是否续保 这一列
    data1 = data['是否续保'].copy()

    # 设置x,y轴
    x = tuple(data1.unique())  # ['是','否']
    y = tuple(data1.value_counts())

    # 画图bar(x, height/就是y, width=0.8/柱子宽度, bottom=None, *, align='center',color, **kwargs):
    plt.bar(x,y,width=0.2,label= '是否续保人数',color='green')
    plt.legend()
    plt.ylabel('人数')
    # 在每根柱子上方添加标签
    for a,b in zip(x,y): # 给柱子加上标签
        plt.text(a,b,b)
    plt.show()

# bar_fig()



# 簇状柱形图: 常用来表示不同类别随着同一变量的变化情况

def cluster_bar():
    """两个分类变量"""
    import os
    import matplotlib
    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np

    matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

    os.chdir(r'D:\pycharm程序文件\练习1')
    data = pd.read_excel('data.xlsx')

    # 取出两分类变量: 险种(x)~是否续保(y)
    # 画出险种是: 交强险 ~是否续保 情况; 商业险 ~是否续保 情况

    data1 = data[['险种','是否续保']].copy()

    data2 = data1[data1['险种']=='交强险'][data1['是否续保']=='是']
    data3 = data1[data1['险种']=='交强险'][data1['是否续保']=='否']
    data4 = data1[data1['险种']=='商业险'][data1['是否续保']=='是']
    data5 = data1[data1['险种']=='商业险'][data1['是否续保']=='否']

    x = np.array([1,2])
    y1 =[data2.shape[0],data4.shape[0]]
    y2 = [data3.shape[0],data5.shape[0]]

    plt.bar(x,y1,width=0.3,color='red',label='是')
    for a,b in zip(x,y1): # 给柱子加上标签
        plt.text(a,b,b)

    # 画簇状柱形图核心是将x轴平移; 分类非常麻烦, 尽量将分类好的结果构成list,series形式;
    # x轴变量必须是series形式(因为只有series允许运算)
    plt.bar(x+0.3,y2,width=0.3,color ='blue',label='否')
    for a,b in zip(x+0.3,y2): # 给柱子加上标签
        plt.text(a,b,b)
    plt.xticks(x,['交强险','商业险'])
    plt.ylabel('是否续保人数')
    plt.title('不同险种的续保情况')
    plt.legend()
    plt.show()

# cluster_bar()



# 绘制条形图

def barh_fig():
    """  条形图就是柱状图横着放 同样用于分类变量之间"""
    import os
    import matplotlib
    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np

    matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

    os.chdir(r'D:\pycharm程序文件\练习1')
    data = pd.read_excel('data.xlsx')

    # 取出一分类变量; 是否续保 这一列
    data1 = data['是否续保'].copy()

    # 设置x,y轴
    x = tuple(data1.unique())  # ['是','否']
    y = tuple(data1.value_counts())

    # 画图barh(y/柱子的位置, width/柱子的长度,横坐标,height/柱子的宽度,, left=None, *, align='center', color, **kwargs):
    plt.barh(x,y, height=0.2, label='是否续保人数', color='green')
    plt.legend()
    plt.xlabel('人数')
    plt.grid(b=True,axis='x',alpha=0.8)
    # 在每根柱子上方添加标签
    for a, b in zip(y, x):  # 给柱子加上标签
        plt.text(a, b, a)
    plt.show()

# barh_fig()




# 绘制饼状图

def pie_fig():
    """ 饼状图通常用来表示同一等级中不同类别的变量占比情况 """
    import os
    import matplotlib
    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np

    matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

    os.chdir(r'D:\pycharm程序文件\练习1')
    data = pd.read_excel('data.xlsx')

    # 取出某一列分类变量: 是否续保 这一列
    data1 = data['是否续保'].copy()

    # 建立绘图数据(也可以是百分比的数据); 饼状图不存在x,y轴
    data2 = dict(data1.value_counts(normalize = False)) # normalize = True 计算百分比,然后转化为字典

    # 将字典data_x 分别取出 键key 和 值value 并转化为元组/列表分别作为标签和绘图数据
    data_x = list(data2.values())
    data_label =list(data2.keys())
    # print(data_x)
    # print(data_label)

    # pie(x/数据,labels/标签,atuopct/百分比格式)
    plt.pie(x=data_x,labels=data_label,autopct='%.0f%%') # autopct='%.0f%%' 数值的百分比格式
    plt.show()

# pie_fig()


# 绘制树状图
def squarify_fig():
    """ 树状图通常用于表示: 同一等级中不同类别的占比关系 ~~~~~ 用法与饼状相似"""
    # squarify.plot(sizes,label,value,)
    import os
    import matplotlib
    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    import squarify   # 没有该模块, 需要安装

    matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

    os.chdir(r'D:\pycharm程序文件\练习1')
    data = pd.read_excel('data.xlsx')

    # 取出多分类变量/渠道
    data1 = data['渠道']

    # 将data1转化为字典
    dict_data1 = dict(data1.value_counts())

    # 将字典中的键和值分别转化为元组或列表
    tuple_key = tuple(dict_data1.keys())
    tuple_value = tuple(dict_data1.values())

    # 设置绘图数据和标签
    size = tuple_value
    label = tuple_key

    #
    squarify.plot(size,label=label)
    plt.show()

# squarify_fig()



# 绘制盒须图/箱形图
def boxplot_fig():
    """盒须图通常用来反映一组数据离散程度,所有用于一组连续变量, 也可以用于比较多组变量;  1.5 IQR 外离群值
        plt.boxplot(x/数据,vert/图方向,=默认True纵向/Fasle横向,widths/图形宽度,labels/标签)
    """

    import os
    import matplotlib
    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np

    matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

    os.chdir(r'D:\pycharm程序文件\练习1')
    data = pd.read_csv('creditcard_exp.csv')

    # 比较男,女的收入水平; 取出这两列
    data1 = data[['Income','gender']].copy()

    # 分类,然后转化为列表
    man_income = list(data1[data1['gender']==1]['Income'])
    woman_income = list(data1[data1['gender'] == 0]['Income'])

    # 绘制盒须图
    x =[man_income,woman_income] # 社设置数据
    label = ['男','女'] # 设立标签
    plt.boxplot(x,labels=label,widths=0.5)
    plt.ylabel('年收入/万元')
    plt.show()

# boxplot_fig()


# 作直方图; 查看单样本数据分布情况, 是否分布正太分布

def hist_fig():
    """ 一般用于连续变量, 查看数据分布情况, 可以同时绘制核密度图, 并用正态分布拟合曲线"""
    import os
    import matplotlib
    import matplotlib.pyplot as plt
    import pandas as pd
    from scipy import stats
    import numpy as np

    matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

    os.chdir(r'D:\pycharm程序文件\练习1')
    data = pd.read_csv("house_price_gr.csv", encoding='gbk')  # 文件有中文,encoding= 'gbk'

    # 取出Income
    data1 = data['rate']

    # 绘制直方图
    plt.figure(figsize=(20,12))
    plt.subplot(2,2,1)
    plt.hist(data1,bins=20)
    # data1.hist(bins=40)

    # 在直方图的基础上, 同时绘制核密度图, 并用正态分布拟合曲线
    # kde = True核密度图, fit = stats.norm用正态分布拟合
    import seaborn as sns
    plt.subplot(2,2,4)
    plt.title('核密度图')
    sns.distplot(data1,bins=20, kde=True)
    plt.subplot(2, 2, 3)
    sns.distplot(data1,bins=20, fit=stats.norm)
    plt.subplot(2, 2, 2)
    sns.distplot(data1,bins=20,kde=True,fit=stats.norm)
    plt.show()

# hist_fig()




# QQ图
def qqplot_fig():
    """
        QQPlot图是用于直观验证一组数据是否来自某个分布,或者验证某两组数据是否来自同一(族)分布。
       常用的是检验数据是否来自于正态分布。服从正态分布时是一条直线
       qplot(self, xlabel=None, ylabel=None, line=None, other=None,
               ax=None, **plotkwargs):
        xlabel, ylabel : str or None, optional
        line : str {'45', 's', 'r', q'} or None
    """
    import os
    import matplotlib
    import matplotlib.pyplot as plt
    import pandas as pd
    from scipy import stats
    import numpy as np

    matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

    os.chdir(r'D:\pycharm程序文件\练习1')
    data = pd.read_csv("creditcard_exp.csv", encoding='gbk')  # 文件有中文,encoding= 'gbk'

    # 取出Income
    data1 = data['Income']
    data2 = data['Age']
    data3 = data['edu_class']

    import statsmodels.api as sm

    # 绘制qq图,查看点分布,并拟合直线, 点在直线上则符合正太分布
    plt.figure(1)
    plt.subplot(2,2,1)
    sm.qqplot(data1, fit=True, line='45')
    plt.title('年收入的分布规律')

    plt.subplot(2,2,2)
    sm.qqplot(data2,fit=True,line='45')

# qqplot_fig()



# 绘制热力图
def imshow_fog():
    """ 热力图的绘图数据必须要是矩阵的形式; 热力图通常用于画系数相关矩阵"""
    import os
    import matplotlib.pyplot as plt
    import matplotlib
    import pandas as pd
    import seaborn as sns

    matplotlib.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

    os.chdir(r'D:\pycharm程序文件\练习1')
    df = pd.read_csv("creditcard_exp.csv", encoding='gbk')  # 文件有中文,encoding= 'gbk'
    data = df.corr()
    fig, ax = plt.subplots(figsize=(20, 20))
    sns.heatmap(data, annot=True, vmax=1, vmin=0, xticklabels=True,
                yticklabels = True, square = True, cmap = "YlGnBu")
    ax.set_title('feature heatmap', fontsize=20)
    plt.xticks(rotation=45)
    plt.show()



imshow_fog()