(代码详解)plt.bar()+plt.text()+画直方图/柱状图+调参美化+修改图的背景颜色+添加网格线+设置直方图的随机填充颜色

目录

一、 目的:

二、数据集:

三、完整代码:

四、代码解析(上面的完整代码分开讲解):

(一)plt.bar()参数

补充1:分别给每根柱子设置宽度

 补充2:使每根柱子的填充颜色随机

(二)plt.tetx()参数

(三)修改背景颜色

(四)添加网格线

(五)写个for循环,将plt.bar()和plt.text()整合到一起

一、 目的:

下面介绍如何利用python画直方图/柱状图,并且美化,得到如下图:

(代码详解)plt.bar()+plt.text()+画直方图/柱状图+调参美化+修改图的背景颜色+添加网格线+设置直方图的随机填充颜色_第1张图片

二、数据集:

导入数据集:

import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_excel("C:\\Users\\86159\Desktop\\CSDN\\直方图数据.xls")

(代码详解)plt.bar()+plt.text()+画直方图/柱状图+调参美化+修改图的背景颜色+添加网格线+设置直方图的随机填充颜色_第2张图片

三、完整代码:

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.bar()参数

      有一些小细节设置,如字体大小等等,直接在代码注释中标注了

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)

结果如下:

(代码详解)plt.bar()+plt.text()+画直方图/柱状图+调参美化+修改图的背景颜色+添加网格线+设置直方图的随机填充颜色_第3张图片

(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='//',增加密度。

补充1:分别给每根柱子设置宽度

       刚刚上面提到了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]

 补充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)

 结果如下:

(代码详解)plt.bar()+plt.text()+画直方图/柱状图+调参美化+修改图的背景颜色+添加网格线+设置直方图的随机填充颜色_第4张图片

(二)plt.tetx()参数

      有一些小细节设置,如字体大小等等,直接在代码注释中标注了

# 用于在图表上添加文本标签
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.bar()+plt.text()+画直方图/柱状图+调参美化+修改图的背景颜色+添加网格线+设置直方图的随机填充颜色_第5张图片

(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.bar()+plt.text()+画直方图/柱状图+调参美化+修改图的背景颜色+添加网格线+设置直方图的随机填充颜色_第6张图片

 
要修改直方图的背景颜色,可以使用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()设置的填充颜色。

(四)添加网格线

(代码详解)plt.bar()+plt.text()+画直方图/柱状图+调参美化+修改图的背景颜色+添加网格线+设置直方图的随机填充颜色_第7张图片

`linewidth`参数用于控制网格线的宽度,例如试一试linewidth=2

alpha控制透明度

color表示网格线的颜色;试一试color='b'

(五)写个for循环,将plt.bar()和plt.text()整合到一起
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()

你可能感兴趣的:(python)