目录
一、 目的:
二、数据集:
三、完整代码:
四、代码解析(上面的完整代码分开讲解):
(一)plt.bar()参数
补充1:分别给每根柱子设置宽度
补充2:使每根柱子的填充颜色随机
(二)plt.tetx()参数
(三)修改背景颜色
(四)添加网格线
(五)写个for循环,将plt.bar()和plt.text()整合到一起
下面介绍如何利用python画直方图/柱状图,并且美化,得到如下图:
导入数据集:
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_excel("C:\\Users\\86159\Desktop\\CSDN\\直方图数据.xls")
plt.figure(figsize=(16,7))
#x轴为"学校名称"的数据
x= data["学校名称"]
#y轴为"学校数量"的数据
y= data["专业数量"]
plt.bar(x,y,width=0.5,edgecolor='yellow',
align="center",alpha=0.5,bottom=0,color="red",
linewidth=5,hatch='/')
#x轴数据旋转45°,并且字体大小设置为15
plt.xticks(rotation=45,fontsize=15)
# 用于在图表上添加文本标签
for a,b in zip(x,y):
plt.text(a, b + 2, '%.0f' % b,ha='center',va='center',fontsize=20,
bbox=dict(boxstyle='round,pad=0.1', fc='yellow',
ec='k',lw=0.5 ,alpha=0.5))
plt.xlabel('学校名称',fontsize=20)#x轴标签
plt.ylabel('专业数目',fontsize=20)#y轴标签
plt.title('专业数目最多的前 20 个学校',fontsize=20)
plt.tick_params(labelsize=16)#设置坐标轴上标签的字体大小
plt.gca().set_facecolor((1, 0.5, 0.6, 0.1))
#或者plt.gca().set_facecolor("lightgrey")
plt.grid(True,alpha=0.4)
plt.show()
有一些小细节设置,如字体大小等等,直接在代码注释中标注了
plt.figure(figsize=(16,7))
#x轴为"学校名称"的数据
x= data["学校名称"]
#y轴为"学校数量"的数据
y= data["专业数量"]
plt.bar(x,y,width=0.5,edgecolor='yellow',
align="center",alpha=0.5,bottom=0,color="red",
linewidth=5,hatch='/')
#x轴数据旋转45°,并且字体大小设置为15
plt.xticks(rotation=45,fontsize=15)
结果如下:
(1)`x`:表示柱子的横坐标。
(2)`y`:表示柱子的高度。
(3)width`:控制柱子的宽度,这里是0.5。
(4)`edgecolor`:表示柱子边缘的颜色,这里是'yellow',表示黄色。还可以选择其它颜色,例如:
1. 'k':黑色
2. 'w':白色
3. 'r':红色
4. 'g':绿色
5. 'b':蓝色
6. 'c':青色
7. 'm':洋红色
8. 'y':黄色
9. 'orange':橙色
10. 'purple':紫色 等
(5)align:表示柱子如何对齐,这里是'center',表示柱子中心对齐。它有以下选择:
'center':将柱子居中对齐。这是默认值,也是最常见的对齐方式。
'edge':将柱子的边缘与x轴刻度线对齐。x位于柱子的左侧。如果想让x位于柱子右侧,需要同时设置负width 以及align='edge'。
(6)alpha:表示柱子的透明度,这里是0.5,表示半透明。
(7)bottom:柱子的基准高度。默认值为0。
小伙伴可以试一试:
①bottom=0,plt.bar(x,y,bottom=0)
②bottom=20,plt.bar(x,y,bottom=20)
③y+20,bottom=20,plt.bar(x,y+20,bottom=20)
观察三者画出来图的纵坐标,体会一下。
(8)color:柱子的填充色。
(9)linewidth:柱子边缘宽度。如果为0,不绘制柱子边缘。(linewidth和edgecolor配合着用,效果更好。小伙伴可以自己体会一下,有问题可以留言哈)
(10)hatch:柱子填充符号。字符串,取值范围为 {'/', '\', '|', '-', '+', 'x', 'o', 'O', '.', '*'},符号可以组合,也可以重复。例如hatch='+/'或hatch='//',增加密度。
刚刚上面提到了width`:控制柱子的宽度,width=0.5,则所有的柱子宽度都是0.5
如果想让不同的柱子由不同的宽度呢?这组数据有15条数据,也就是绘画出15根柱子,可以分别指定每根柱子的宽度,如下:
width=[0.5,0.8,0.1,0.5,0.5,0.5,0.5,0.5,0.6,0.3,0.2,0.9,0.1,0.5,0.2]
要让填充颜色随机,可以使用random.choice()
函数从颜色列表中随机选择一个颜色。以下是修改后的代码:
plt.figure(figsize=(16,7))
#x轴为"学校名称"的数据
x= data["学校名称"]
#y轴为"学校数量"的数据
y= data["专业数量"]
import random
colors = ['red', 'blue', 'green', 'yellow', 'orange', 'purple']
color_list = [random.choice(colors) for _ in range(len(x))] # 随机选择一个颜色列表
for i in range(len(x)):
plt.bar(x[i], y[i], width=0.5, edgecolor='yellow',
align="center", alpha=0.5, bottom=0, color=color_list[i],
linewidth=5, hatch='/')
#x轴数据旋转45°,并且字体大小设置为15
plt.xticks(rotation=45,fontsize=15)
结果如下:
有一些小细节设置,如字体大小等等,直接在代码注释中标注了
# 用于在图表上添加文本标签
for a,b in zip(x,y):
plt.text(a, b + 2, '%.0f' % b,ha='center',va='center',fontsize=20,
bbox=dict(boxstyle='round,pad=0.1', fc='yellow',
ec='k',lw=0.5 ,alpha=0.5))
plt.xlabel('学校名称',fontsize=20)#x轴标签
plt.ylabel('专业数目',fontsize=20)#y轴标签
plt.title('专业数目最多的前 20 个学校',fontsize=20)
plt.tick_params(labelsize=16)#设置坐标轴上标签的字体大小
结果如下:
(1) `a`和`b`分别是文本标签的位置坐标,即文本标签会出现在哪个位置。
在这里,它们分别对应于数据点的x值和y值。
`b + 2`表示文本标签的内容,即数据点的y值加上了2的偏移量。也就是文本标签比原先的位置
高了两个单位距离。这样可以使文本标签距离数据点稍远一些。
(2)`%.0f' % b表示文本标签的内容格式,即对数据点的y值进行浮点数舍入(四舍五入)并使用字
符串格式化(`%`)输出。
例如,如果b等于1.234,那么 label 将显示为 "1.2"。
(3)参数verticalalignment(简称va):垂直对齐方式 ,总的来说,效果是控制标签离直方图的柱子的远近
可选:‘center’ /‘top’ / ‘bottom’ / ‘baseline’ /‘center_baseline’
top离直方图柱子最近,其次是center,然后是baseline和center_baseline,这两个效果上区别好像是不明显,bottom最远。
所以当我们发现默认的label的位置不理想的时候,我们可以通过设置此参数来控制效果。
(4) 参数horizontalalignment(简称ha):水平对齐方式
可选:‘center’ / ‘right’ / ‘left’
(5)`fontsize=20`表示文本标签的字体大小。在这里,字体大小设置为20。
(6)bbox给文本标签增加外框 ,其中有很多参数,如:
boxstyle:方框外形
facecolor:(简写fc)背景颜色
edgecolor:(简写ec)边框线条颜色
edgewidth:边框线条大小
`boxstyle`参数在matplotlib的`bbox`字典中用于设置文本框的样式。
它有以下几种选择(我查到的是可以取这些值,有更深入追求的小伙伴可以查一下还有没有其它参数选项):
'round':创建一个圆角矩形
'square':创建一个方形
'circle':创建一个圆形
如:bbox=dict(boxstyle='round,pad=0.5', fc='yellow', ec='k',lw=1 ,alpha=0.5)
创建了 一个圆角矩形、大小为pad=0.5、fc='yellow'表示边界框的填充颜色为黄色、ec='k'表示边界框的边框颜色为黑色、lw=1表示边界框的边框宽度为1、alpha=0.5表示边界框的透明度为50%。
plt.gca().set_facecolor((1, 0.5, 0.6, 0.1))
#或者plt.gca().set_facecolor("lightgrey")
结果如下:
要修改直方图的背景颜色,可以使用plt.gca().set_facecolor()方法。
①plt.gca().set_facecolor("lightgrey") 可以直接选定背景颜色,这里是浅灰色。
②可以使用RGB颜色编码,其中第四个值表示透明度。
如:plt.gca().set_facecolor((1, 0.5, 0.6, 0.1))
`(1, 0.5, 0.6, 0.1)`:这是一个包含四个元素的元组,分别表示红色、绿色、蓝色的强度(范围为0-1)以及透明度(范围为0-1)。
具体来说,(1, 0.5, 0.6, 0.1) 表示的是红色通道、绿色通道、蓝色通道和透明度。
其中,红色通道的值是1,绿色通道的值是0.5,蓝色通道的值是0.6,透明度(alpha)的值是0.1。
这种颜色通道的组合形成了plt.gca().set_facecolor()设置的填充颜色。
`linewidth`参数用于控制网格线的宽度,例如试一试linewidth=2
alpha控制透明度
color表示网格线的颜色;试一试color='b'
plt.figure(figsize=(16,7))
#x轴为"学校名称"的数据
x= data["学校名称"]
#y轴为"学校数量"的数据
y= data["专业数量"]
for i in range(len(data)):
plt.bar(x,y,width=0.5,edgecolor='yellow',
align="center",alpha=0.5,bottom=0,color="red",
linewidth=5,hatch='/')
plt.text(x[i],y[i]+2,'%.0f' % b,ha='center',va='center',fontsize=20,
bbox=dict(boxstyle='round,pad=0.1', fc='yellow',
ec='k',lw=0.5 ,alpha=0.5))
# colors = ['red', 'blue', 'green', 'yellow', 'orange', 'purple']
# for i in range(len(data)):
# color = random.choice(colors) # 随机选择一个颜色
# plt.bar(x[i], y[i], width=0.5, edgecolor='yellow', align="center", alpha=0.5,
# bottom=0, color=color, linewidth=5, hatch='/')
# plt.text(x[i], y[i] + 2, '%.0f' % b, ha='center', va='center', fontsize=20,
# bbox=dict(boxstyle='round,pad=0.1', fc='yellow', ec='k', lw=0.5, alpha=0.5))
plt.title("专业数目最多的15个学校",fontsize=20)
plt.xlabel("学校",fontsize=20)
plt.ylabel("专业数",fontsize=20)
plt.xticks(rotation=45,fontsize=15)
plt.tick_params(labelsize=16)
# 要修改直方图的背景颜色,可以使用plt.gca().set_facecolor()方法。
plt.gca().set_facecolor((1, 0.5, 0.6, 0.1))
#或者plt.gca().set_facecolor("lightgrey")
# # 添加网格线
# `linewidth`参数用于控制网格线的宽度。
plt.grid(True,alpha=0.4)
# plt.grid(True)
plt.show()