zoukankan      html  css  js  c++  java
  • Matplotlib 的正确使用方法,画一张好看的图

    前言

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

    作者:Python中文社区

    在这里插入图片描述
    本文用的数据如图所示,Dataframe中显示的是相关职位对应的地区和相应的薪水状况,单位是千,要统计各个城市的薪资状况。
    在这里插入图片描述
    最终目的是用Matplotlib结合Seaborn得到这种可视化效果
    在这里插入图片描述
    首先,导入要用到的包,由于需要在图中显示中文字,还需要进行一些字体的设置。

    import matplotlib.pyplot as plt
    import seaborn as sns
    %matplotlib inline
    
    
    # 设置中文字体为微软雅黑
    plt.rcParams['font.sans-serif'] = 'SimHei'

    先用Seaborn生成一张基础的柱状图,并给图加上标题,之后围绕这张图进行进一步的修改。

    fig,ax = plt.subplots(figsize=(9,6))
    sns.barplot(x='city',y='salary',data=df,ci=95,ax=ax)
    ax.set_title('各城市薪资水平对比')

    在这里插入图片描述
    可以比较明显看出横纵坐标的刻度标签的字体有点小,同时刻度线显示起来不好看,所以第一步把刻度标签的字体放大并去掉刻度线。

    由于刻度的设置是tick的属性,所以用ax.tick_param()进行设置,用参数labelsize指定刻度标签的大小,将length参数设置刻度线长短。

    fig,ax = plt.subplots(figsize=(9,6))
    sns.barplot(x='city',y='salary',data=df,ci=95,ax=ax)
    ax.set_title('各城市薪资水平对比')
    
    # 字体为16px大小,刻度线长度为0
    ax.tick_params(labelsize=16,length=0)

    第二步,去掉四边的边框(真的不好看),这里有两种实现方式。

    第一种是用上篇文章说过的ax.spines[‘xx’].set_visible(False)分别对top、bottoom、left和right进行设置。

    第二种方式,由于这里只有一个Axes且四个边框都去掉,所以也可以直接使用plt.box(False)

    fig,ax = plt.subplots(figsize=(9,6))
    sns.barplot(x='city',y='salary',data=df,ci=95,ax=ax)
    ax.set_title('各城市薪资水平对比')
    
    # 字体为16px大小,刻度线长度为0
    ax.tick_params(labelsize=16,length=0)
    
    #法一:
    ax.spines['left'].set_visible(False)
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.spines['bottom'].set_visible(False)
    
    #法二
    plt.box(False)

    接下来,为了使条形图呈从小到大渐变的效果,可以指定各个城市的排列顺序,并设置相应的颜色映射。

    对各个城市的薪水求均值并从小到大排序,获取城市排序列表city_order

    city_order = df.groupby("city")["salary"].mean()
                   .sort_values()
                   .index.tolist()

    然后用Seaborn中的order和palette分别设置排列顺序和颜色。

    fig,ax = plt.subplots(figsize=(9,6))
    sns.barplot(x='city',y='salary',data=df,ci=95,ax=ax,
               order = city_order,palette = "RdBu_r")
    ax.set_title('各城市薪资水平对比')
    
    # 字体为16px大小,刻度线长度为0
    ax.tick_params(labelsize=16,length=0)
    plt.box(False)

    在这里插入图片描述
    紧接着在y轴上添加网格线便于观察每个柱子的数值大小,因为是在y轴上,网格线为grid,所以用ax.yaxis.grid()进行设置

    fig,ax = plt.subplots(figsize=(9,6))
    sns.barplot(x='city',y='salary',data=df,ci=95,ax=ax,
               order = city_order,palette = "RdBu_r")
    ax.set_title('各城市薪资水平对比')
    
    # 字体为16px大小,刻度线长度为0
    ax.tick_params(labelsize=16,length=0)
    plt.box(False)
    
    # 设置y轴网格线
    ax.yaxis.grid(linewidth=0.5,color='black')
    # 将网格线置于底层
    ax.set_axisbelow(True)

    由于x轴和y轴含义比较清晰,所以可以将横纵坐标的标签去掉,同时,为了更直观,可以将y轴的刻度标签由20,15…换成20k,15k…

    这个过程分别用到ax.set_xlabel(),ax.set_ylabel()和ax.set_yticklabels()

    fig,ax = plt.subplots(figsize=(9,6))
    sns.barplot(x='city',y='salary',data=df,ci=95,ax=ax,
               order = city_order,palette = "RdBu_r")
    ax.set_title('各城市薪资水平对比')
    
    # 字体为16px大小,刻度线长度为0
    ax.tick_params(labelsize=16,length=0)
    plt.box(False)
    
    # 设置y轴网格线
    ax.yaxis.grid(linewidth=0.5,color='black')
    # 将网格线置于底层,
    ax.set_axisbelow(True)
    
    ax.set_xlabel('')
    ax.set_ylabel('')
    # 将0处设为空字符串,其他地方加上k
    ax.set_yticklabels([" ","5k","10k","15k","20k"])

    最后对标题进行设置,让标题更加好看,这一步主要是对ax.set_title()中的参数进行调整,主要包括

    backgroundcolor:控制背景颜色
    fontsize:控制字体大小
    weight:控制字体粗细
    color:控制字体颜色
    fig,ax = plt.subplots(figsize=(9,6))
    
    sns.barplot(x='city',y='salary',data=df,ci=95,ax=ax,
               order = city_order,palette = "RdBu_r")
    
    # 字体为16px大小,刻度线长度为0
    ax.tick_params(labelsize=16,length=0)
    plt.box(False)
    
    # 设置y轴网格线
    ax.yaxis.grid(linewidth=0.5,color='black')
    # 将网格线置于底层,
    ax.set_axisbelow(True)
    
    ax.set_xlabel('')
    ax.set_ylabel('')
    # 将0处设为空字符串,其他地方加上k
    ax.set_yticklabels([" ","5k","10k","15k","20k"])
    
    ax.set_title('               各城市薪资水平对比             ',backgroundcolor='#3c7f99',
                fontsize=24, weight='bold',color='white')

    在这里插入图片描述

  • 相关阅读:
    npm的qs包的使用:stringify()将json对象序列化成表单数据
    git放弃本地某个文件或所有文件的修改
    git关联本地分支和远程分支, 在本地删除远程已经不存在的分支
    vs code代码提示的问题
    js BOM(二)offset系列,scroll系列,client系列,封装变速动画函数
    解决antd design的Modal组件弹出卡顿的问题
    js BOM(一)window、location、history、navigator、定时器setInterval,setTimeout,轮播图
    BizCharts渲染多条曲线时color的使用
    js DOM(三)节点、元素创建3种方式、为元素绑定多个事件addEventListener、attachEvent
    HDU 1081 To The Max
  • 原文地址:https://www.cnblogs.com/hhh188764/p/13072500.html
Copyright © 2011-2022 走看看