暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python数据可视化工具Matplotlib第二篇:柱状图

BPShare 2022-09-20
708


今天我们来学习柱状图

老套路,先导包

    import pandas as pd
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    mpl.rcParams['font.family'] = 'SimHei' #显示中文
    plt.rcParams['axes.unicode_minus'] = False #显示中文

    接着加载数据,然后显示一下load的数据大概什么样子,有个印象。

      # 加载数据
      order_data = pd.read_excel(r".\dataset\Orders_Info.xlsx")
      # 查看数据概况
      order_data


      可以看到,这个数据集是某手机销售商2017年,2018年的各分店销售数据。那么,需求来了,老板想看一下这两年各个分店的销售情况!

      那第一步,我们需要计算一下这两年各个分店的销售总数量,很清楚,是按照店铺名称来统计。这种计算需求在Pandas里很常见,实现起来相对来说比较简单:一行代码搞定

        gb_shop_name_df = order_data.groupby('店铺名称')['数量'].agg('sum').reset_index()

        大概意思就是按照店铺名称分组,统计数量那一列,然后对数量那一列执行求和操作,最后一个是重新生成index。

        那我们来看一下gb_shop_name_df长什么样子:

        有了这个,我们就可以开始画柱状图了:

          plt.figure(figsize=(15,8))
          plt.bar(gb_shop_name_df['店铺名称'], gb_shop_name_df['数量'])
          plt.show()


          画出来大概这个样子


          颜色有点儿深,那就改一下透明度

            plt.figure(figsize=(10,8))
            plt.bar(gb_shop_name_df['店铺名称'], gb_shop_name_df['数量'], alpha=0.5) # 添加透明度
            plt.show()


            添加透明度的效果


            接下来我们再添加图例,x轴标签,y轴标签:

              plt.figure(figsize=(15,8))
              plt.bar(gb_shop_name_df['店铺名称'], gb_shop_name_df['数量'], alpha=0.5, label='手机销量') # 添加图例
              plt.xlabel('分店名称', fontsize=20) # 添加x轴标签,并设置字体大小
              plt.ylabel('销量', fontsize=20) # 添加y轴标签,并设置字体大小
              plt.legend() # 显示图例
              plt.show()

              效果如下:


              小伙伴说这个柱状上没有显示数据值啊!没问题,我们来给每个柱子上添加对应的值。

                # 定义一个添加数值的函数
                def autolabel(bars):
                for bar in bars:
                        height = bar.get_height() # 获取bar的高度
                plt.text(bar.get_x() + bar.get_width()/2, height, height, size=10) # 这里面前3个参数对应x轴位置,y轴位置和需要显示的值




                plt.figure(figsize=(15,8))


                bar_chart = plt.bar(gb_shop_name_df['店铺名称'], gb_shop_name_df['数量'], alpha=0.5, label='手机销量')


                autolabel(bar_chart)


                plt.xlabel('分店名称', fontsize=20)
                plt.ylabel('销量', fontsize=20)


                plt.legend()
                plt.show()


                效果如下

                x轴和y轴刻度字体比较小,我们来调整一下

                  def autolabel(bars):
                  for bar in bars:
                  height = bar.get_height()
                          plt.text(bar.get_x() + bar.get_width()/2, height, height, size=10# 这里面前3个参数对应x轴位置,y轴位置和需要显示的值




                  plt.figure(figsize=(15,8))


                  bar_chart = plt.bar(gb_shop_name_df['店铺名称'], gb_shop_name_df['数量'], alpha=0.5, label='手机销量')


                  autolabel(bar_chart)


                  plt.xlabel('分店名称', fontsize=20)
                  plt.ylabel('销量', fontsize=20)


                  plt.tick_params(labelsize=15) # 调整x轴,y轴刻度字体大小


                  plt.legend()
                  plt.show()

                  现在看起来好多了

                  但是柱子上的值显示的位置还是靠中间偏右一些,其实应该居中显示,莫慌,有这个参数

                    def autolabel(bars):
                    for bar in bars:
                    height = bar.get_height()
                    plt.text(bar.get_x() + bar.get_width()/2, height, height, size=10, ha='center') # 让标签值水平居中显示




                    plt.figure(figsize=(15,8))
                    bar_chart = plt.bar(gb_shop_name_df['店铺名称'], gb_shop_name_df['数量'], alpha=0.5, label='手机销量')
                    autolabel(bar_chart)
                    plt.xlabel('分店名称', fontsize=20)
                    plt.ylabel('销量', fontsize=20)
                    plt.tick_params(labelsize=15# 调整x轴,y轴刻度字体大小
                    plt.legend()
                    plt.show()

                    效果如下

                    显示是居中了,但是离柱子太近了,这个值和柱子之间有些间距应该,这个也简单。我们调整一下,只需要在添加标签函数里,plt.text()里第二个参数,也就是y的高度在原来的基础上高一点点就行了,所以这里我让heiht*1.012

                      def autolabel(bars):
                      for bar in bars:
                      height = bar.get_height()
                              plt.text(bar.get_x() + bar.get_width()/2, height*1.012, height, size=10, ha='center'# 让标签值水平居中显示




                      plt.figure(figsize=(15,8))
                      bar_chart = plt.bar(gb_shop_name_df['店铺名称'], gb_shop_name_df['数量'], alpha=0.5, label='手机销量')
                      autolabel(bar_chart)
                      plt.xlabel('分店名称', fontsize=20)
                      plt.ylabel('销量', fontsize=20)
                      plt.tick_params(labelsize=15) # 调整x轴,y轴刻度字体大小
                      plt.legend()
                      plt.show()

                      看效果


                      有小伙伴说可否再配合折线图,画出走势呢?也是可以的,就是在同一个画布上,再加一个折线图而已,问题不大。折线图我们让线条显示虚线

                        def autolabel(bars):
                        for bar in bars:
                        height = bar.get_height()
                                plt.text(bar.get_x()+bar.get_width()/21.012*height, str(height), size=10, ha='center')




                        plt.figure(figsize=(15,10))
                        plt.plot(gb_shop_name_df['店铺名称'], gb_shop_name_df['数量'], c='tab:orange', ls='--') # 添加折线图
                        bar_chart = plt.bar(gb_shop_name_df['店铺名称'], gb_shop_name_df['数量'], alpha=0.5, label='手机销量')
                        autolabel(bar_chart)


                        plt.legend()
                        plt.xlabel('店铺名称', fontsize=30)
                        plt.ylabel('总销量', fontsize=30)
                        plt.title('分店销售量示意图')
                        plt.tick_params(labelsize=15)
                        plt.show()

                        效果如下


                        有小伙伴说x轴,店铺名称离的太近了,有那种让店铺名称倾斜的操作没?

                        答案是肯定的,很简单,只需要添加一个参数:plt.xticks(rotation=n),n就是你想让它倾斜多少度,这里我设置成45度,来看看效果。

                          def autolabel(bars):
                          for bar in bars:
                          height = bar.get_height()
                          plt.text(bar.get_x()+bar.get_width()/2, 1.012*height, str(height), size=10, ha='center')




                          plt.figure(figsize=(15,10))
                          plt.plot(gb_shop_name_df['店铺名称'], gb_shop_name_df['数量'], c='tab:orange', ls='--') # 添加折线图
                          bar_chart = plt.bar(gb_shop_name_df['店铺名称'], gb_shop_name_df['数量'], alpha=0.5, label='手机销量')
                          autolabel(bar_chart)


                          plt.legend()
                          plt.xlabel('店铺名称', fontsize=30)
                          plt.ylabel('总销量', fontsize=30)
                          plt.title('分店销售量示意图')
                          plt.tick_params(labelsize=15)
                          plt.xticks(rotation=45) # 让x轴数值倾斜45度
                          plt.show()

                          最后一个知识点,如果想保存画好的图片到本地,直接在画好图之后,添加一句:

                            plt.savefig('bar_chart.png', dpi=200) # 第一个参数是保存的文件名称,第二个是图片的清晰度,dpi数值越大,文件越大,保存时花费的时间越长。

                            好了,今天就先改到这里吧!有关柱状图,如果还有其它想要知道的,点击关注本公众号,后台留言,我会尽快给大家回复。

                            点击关注本公众号,且听下回分解!

                            👇


                            文章转载自BPShare,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论