Python Matplotlib数据可视化绘图教程之一:如何绘制柱状图

文章目录

  • 前言
  • 一、所用到的模块
  • 二、单一颜色的普通不分组柱状图
  • 1.示例数据如下
  • 2.代码如下
  • 2.1 代码如下(示例):
  • 2.1.1 Case1:
  • 2.1.2 Case2:
  • 2.1.3 Case3:
  • 三、多种颜色的普通不分组柱状图
  • 1.示例数据如下
  • 2.代码如下
  • 2.1 代码如下(示例):
  • 2.1.1 Case1:
  • 四、多种颜色的普通分组柱状图
  • 1.示例数据如下
  • 2.代码如下
  • 2.1 代码如下(示例):
  • 2.1.1 Case1:
  • 2.2 我们可以看到,在上述作图过程中,我们把画布(fig)背景色设置为#B0C4DE,把轴域(ax)背景色或者称为绘图区域背景色设置为white(纯白色),以上图片都是我截图保存下来的,所以能够保持我们对fig和ax的背景色的设置,但是如果我们想用plt.savefig()语句把图片保存到本地,且仍然保留我们对fig和ax的背景色的设置的话,需要使用以下语句参数,如下所示:
  • 五、总结

  • 前言

    本文我们主要介绍利用Python中的Matplotlib模块进行几种柱状图的画法,包括整张图片只有一种颜色的不分组柱状图、整张图片有好几种颜色的不分组柱状图、整张图片有好几种颜色的分组柱状图等。


    一、所用到的模块

    主要利用Python中的Matplotlib模块完成该功能。

    二、单一颜色的普通不分组柱状图

    1.示例数据如下

    表格如下(示例):

    语言种类 2020年用户量(人数)
    C 2000
    C++ 3000
    Python 3000
    Java 5000
    Java Script 2000
    PHP 1000
    Ruby 800

    现在需要把表格中的数据绘制成柱状图,从而进一步分析各类语言的用户的使用情况。

    2.代码如下

    2.1 代码如下(示例):

    2.1.1 Case1:

    import matplotlib
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 设置字体, 解决中文乱码问题
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    # 解决图像中的'-'负号的乱码问题
    plt.rcParams['axes.unicode_minus'] = False
    
    x_labels = ['C', 'C++', 'Python', 'Java', 'Java Script', 'PHP', 'Ruby']
    y = [2000, 3000, 3000, 5000, 2000, 1000, 800]
    fig = plt.figure(figsize=(8, 6), facecolor='#B0C4DE')
    ax = fig.add_subplot(facecolor='white')
    # 红橙黄绿青蓝紫
    color_list = ['#FF0000', '#FF8C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#800080']
    x_loc = np.arange(7)
    # 这里颜色设置成 橙色:"#FF8C00"
    ax.bar(x_loc, y, color=color_list[1])
    plt.grid(True, ls=':', color='b', alpha=0.3)
    plt.xlabel('编程语言类别', fontweight='bold')
    plt.ylabel('编程语言用户量(人数)', fontweight='bold')
    plt.title('编程语言用户量数据分析图', fontweight='bold')
    plt.show()
    

    输出结果如下:

    注意:此时图片的横坐标的刻度标签没有按照我们的要求把各个语言的名字显示出来,并且图片中没有网格,不方便我们查看对应的纵轴的值。


    2.1.2 Case2:

    因此,我们对上述代码优化如下:
    (1)把横坐标的刻度标签加上去:

    ax.set_xticklabels(x_labels)
    

    (2)加上网格:

    plt.grid(True, ls=':', color='b', alpha=0.3)
    

    此时完整代码如下:

    import matplotlib
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 设置字体, 解决中文乱码问题
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    # 解决图像中的'-'负号的乱码问题
    plt.rcParams['axes.unicode_minus'] = False
    
    x_labels = ['C', 'C++', 'Python', 'Java', 'Java Script', 'PHP', 'Ruby']
    y = [2000, 3000, 3000, 5000, 2000, 1000, 800]
    fig = plt.figure(figsize=(8, 6), facecolor='#B0C4DE')
    ax = fig.add_subplot(facecolor='white')
    # 红橙黄绿青蓝紫
    color_list = ['#FF0000', '#FF8C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#800080']
    x_loc = np.arange(7)
    # 这里颜色设置成 橙色:"#FF8C00"
    ax.bar(x_loc, y, color=color_list[1])
    ax.set_xticklabels(x_labels)
    plt.grid(True, ls=':', color='b', alpha=0.3)
    plt.xlabel('编程语言类别', fontweight='bold')
    plt.ylabel('编程语言用户量(人数)', fontweight='bold')
    plt.title('编程语言用户量数据分析图', fontweight='bold')
    plt.show()
    

    输出结果如下:

    注意:此时坐标轴还是没有按照我们想要的样子来呈现对应的刻度标签,并且会报出如下的错误提示:


    2.1.3 Case3:

    小编经过一番debug发现出现这个报错的原因是我们在ax.set_xticklabels(x_labels)前面没有加上ax.set_xticks(x_labels)这句语句。下面我们把这句语句加上去,再试试。此时完整代码如下:

    import matplotlib
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 设置字体, 解决中文乱码问题
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    # 解决图像中的'-'负号的乱码问题
    plt.rcParams['axes.unicode_minus'] = False
    
    x_labels = ['C', 'C++', 'Python', 'Java', 'Java Script', 'PHP', 'Ruby']
    y = [2000, 3000, 3000, 5000, 2000, 1000, 800]
    fig = plt.figure(figsize=(8, 6), facecolor='#B0C4DE')
    ax = fig.add_subplot(facecolor='white')
    # 红橙黄绿青蓝紫
    color_list = ['#FF0000', '#FF8C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#800080']
    x_loc = np.arange(7)
    # 这里颜色设置成 橙色:"#FF8C00"
    ax.bar(x_loc, y, color=color_list[1])
    ax.set_xticks(x_loc)
    ax.set_xticklabels(x_labels)
    plt.grid(True, ls=':', color='b', alpha=0.3)
    plt.xlabel('编程语言类别', fontweight='bold')
    plt.ylabel('编程语言用户量(人数)', fontweight='bold')
    plt.title('编程语言用户量数据分析图', fontweight='bold')
    plt.show()
    

    输出结果如下:


    三、多种颜色的普通不分组柱状图

    1.示例数据如下

    表格如下(示例):

    语言种类 2020年用户量(人数)
    C 2000
    C++ 3000
    Python 3000
    Java 5000
    Java Script 2000
    PHP 1000
    Ruby 800

    现在需要把表格中的数据绘制成柱状图,从而进一步分析各类语言的用户的使用情况。

    2.代码如下

    2.1 代码如下(示例):

    2.1.1 Case1:

    import matplotlib
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 设置字体, 解决中文乱码问题
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    # 解决图像中的'-'负号的乱码问题
    plt.rcParams['axes.unicode_minus'] = False
    
    x_labels = ['C', 'C++', 'Python', 'Java', 'Java Script', 'PHP', 'Ruby']
    y = [2000, 3000, 3000, 5000, 2000, 1000, 800]
    fig = plt.figure(figsize=(8, 6), facecolor='#B0C4DE')
    ax = fig.add_subplot(facecolor='white')
    # 红橙黄绿青蓝紫
    color_list = ['#FF0000', '#FF8C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#800080']
    x_loc = np.arange(7)
    # 这里颜色设置成 橙色:"#FF8C00"
    ax.bar(x_loc, y, color=color_list)
    ax.set_xticks(x_loc)
    ax.set_xticklabels(x_labels)
    plt.grid(True, ls=':', color='b', alpha=0.3)
    plt.xlabel('编程语言类别', fontweight='bold')
    plt.ylabel('编程语言用户量(人数)', fontweight='bold')
    plt.title('编程语言用户量数据分析图', fontweight='bold')
    plt.show()
    

    输出结果如下:


    四、多种颜色的普通分组柱状图

    1.示例数据如下

    假如增加了2021和2022年每种语言的用户量情况,数据如下表所示(示例):

    语言种类 2020年用户量人数 2021年用户量人数 2022年用户量人数
    C 2000 3000 5000
    C++ 3000 4000 6000
    Python 3000 6000 10000
    Java 5000 4000 6000
    Java Script 2000 4000 3000
    PHP 1000 2000 2000
    Ruby 800 1000 1000

    现在需要把表格中的数据绘制成柱状图,从而进一步分析各类语言的用户的使用情况。

    2.代码如下

    2.1 代码如下(示例):

    2.1.1 Case1:

  • 代码如下:
  • import matplotlib
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 设置字体, 解决中文乱码问题
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    # 解决图像中的'-'负号的乱码问题
    plt.rcParams['axes.unicode_minus'] = False
    
    x_labels = ['C', 'C++', 'Python', 'Java', 'Java Script', 'PHP', 'Ruby']
    y_2020 = [2000, 3000, 3000, 5000, 2000, 1000, 800]
    y_2021 = [3000, 4000, 6000, 4000, 4000, 2000, 1000]
    y_2022 = [5000, 6000, 10000, 6000, 3000, 2000, 1000]
    legend_labels = ['2020', '2021', '2022']
    y = [y_2020, y_2021, y_2022]
    fig = plt.figure(figsize=(8, 6), facecolor='#B0C4DE')
    ax = fig.add_subplot(facecolor='white')
    # 红橙黄绿青蓝紫
    color_list = ['#FF0000', '#FF8C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#800080']
    x_loc = np.arange(7)
    # x轴上每个刻度上能容纳的柱子的总的宽度设为0.8
    total_width = 0.8
    # 由y值可以看出x轴每个刻度上一共有3组数据, 也即3个柱子
    total_num = 3
    # 每个柱子的宽度用each_width表示
    each_width = total_width / total_num
    if total_num % 2 == 0:
        x1 = x_loc - (total_num / 2 - 1) * each_width - each_width / 2
    else:
        x1 = x_loc - ((total_num - 1) / 2) * each_width
    x_list = [x1 + each_width * i for i in range(total_num)]
    print(x_list)
    # 这里颜色设置成 橙色:"#FF8C00"
    for i in range(0, len(y)):
        ax.bar(x_list[i], y[i], color=color_list[i], width=each_width, label=legend_labels[i])
    ax.set_xticks(x_loc)
    ax.set_xticklabels(x_labels)
    ax.grid(True, ls=':', color='b', alpha=0.3)
    ax.set_xlabel('编程语言类别', fontweight='bold')
    ax.set_ylabel('编程语言用户量(人数)', fontweight='bold')
    plt.title('编程语言用户量数据分析图', fontweight='bold', pad=25)
    # 添加双轴
    ax_twinx = ax.twinx()
    ax_twinx.plot(x_loc, y_2021, linestyle='-', marker='o', markersize=3, color=color_list[1], label='Middle')
    fig.legend(loc='upper center', bbox_to_anchor=(0.5, 0.96), frameon=False, ncol=5, handlelength=0.9, handleheight=0.9, fontsize='small')
    ax_twinx.set_ylabel('Middle', fontweight='bold')
    fig.tight_layout()
    fig.subplots_adjust(top=0.9)
    plt.show()
    
  • 输出结果如下:

  • 2.2 我们可以看到,在上述作图过程中,我们把画布(fig)背景色设置为#B0C4DE,把轴域(ax)背景色或者称为绘图区域背景色设置为white(纯白色),以上图片都是我截图保存下来的,所以能够保持我们对fig和ax的背景色的设置,但是如果我们想用plt.savefig()语句把图片保存到本地,且仍然保留我们对fig和ax的背景色的设置的话,需要使用以下语句参数,如下所示:

    plt.savefig(picturename + '.jpg', facecolor=self.fig.get_facecolor())
    # facecolor=self.fig.get_facecolor()就是需要我们添加的参数, 这样我们就能把图片的fig和ax区域设定的背景色保存到本地了。
    

    五、总结

    以上就是今天要讲的内容,本文仅仅简单介绍了Python中Matplotlib模块对于绘制柱状图时需要注意的方面,对于不同类型的柱状图,我们需要设置不同的参数来调控。希望对广大初学者网友有帮助。

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python Matplotlib数据可视化绘图教程之一:如何绘制柱状图

    发表评论