
今天我们来学习柱状图
老套路,先导包
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数值越大,文件越大,保存时花费的时间越长。
好了,今天就先改到这里吧!有关柱状图,如果还有其它想要知道的,点击关注本公众号,后台留言,我会尽快给大家回复。
点击关注本公众号,且听下回分解!
👇




