ITPub博客

首页 > 数据库 > 数据库开发技术 > Python数据可视化工具Matplotlib第二篇:柱状图

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

原创 数据库开发技术 作者:招牌鸡蛋面 时间:2022-09-20 22:56:16 0 删除 编辑


今天我们来学习柱状图

老套路,先导包

import pandas as pdimport matplotlib as mplimport matplotlib.pyplot as pltmpl.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()/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.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;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
干过测试,做过运维,还兼职过售前+投标+实施+售后+客户培训。前两年入坑大数据开发,熟悉Azure + Databricks大数据相关产品。 喜欢研究技术,所以搞了一个公众号:BPShare,分享一些经验和心得。欢迎骚扰~~~

注册时间:2020-02-17

  • 博文量
    90
  • 访问量
    44236