python绘制柱状图,并添加标签_csdnpython柱状图添加数据标签-程序员宅基地

技术标签: python  # 9.绘图与可视化  开发语言  

1. 绘图

利用下面的代码,绘制柱状图。

#  season number , warning!!! not percent
def season_number(data_all_profile, output_num_season_png, sector_id=None, terrain=None, label=None):
    df_season = data_all_profile['season'].value_counts()
    # 希望的排序列表
    desired_order = ['spring', 'summer', 'autumn', 'winter']

    # 使用reindex方法按指定顺序重新排序
    sorted_result = df_season.reindex(desired_order)

    df_season = pd.DataFrame(sorted_result)
    df_season.rename(columns={
    'season': 'count'}, inplace=True)
    df_season = df_season.reset_index().rename(columns={
    'index': 'season'})

    # 创建柱状图
    plt.figure(figsize=(5, 3))
    bars = plt.bar(df_season['season'], df_season['count'], width=0.3)

    # 添加数据标签
    for bar in bars:
        height = bar.get_height()
        plt.annotate(f'{
      height}',
                     xy=(bar.get_x() + bar.get_width() / 2, height),
                     xytext=(0, 3),  # 3 points vertical offset
                     textcoords="offset points",
                     ha='center', va='bottom')

    # 调整y轴上限,以确保标签可见
    plt.ylim(0, max(df_season['count']) * 1.1)

    plt.xticks(rotation=0)
    plt.xlabel('season', fontsize=11)
    plt.ylabel('数量(个)', fontsize=11)
    plt.title('各季节风廓线数量分布')
    plt.title(f'{
      terrain}-区域{
      sector_id}各季节风廓线数量分布')
    plt.tight_layout()
    plt.savefig(output_num_season_png)  # 将图片保存为 output.png 文件
    plt.close()

在这里插入图片描述

2. 解读

2.1 绘制标签

难点:绘制标签

# 添加数据标签
for bar in bars:
    height = bar.get_height()
    plt.annotate(f'{
      height}',
                 xy=(bar.get_x() + bar.get_width() / 2, height),
                 xytext=(0, 3),  # 3 points vertical offset
                 textcoords="offset points",
                 ha='center', va='bottom')

bar.get_height()用于获取柱子的高度,也就是柱状图中每个柱子的高度值。在上面的代码中,我们使用这个高度值来确定要在柱子上方添加的数据标签的位置。

具体来说,这行代码:

height = bar.get_height()

height设置为当前柱子的高度。然后,在plt.annotate()函数中,我们使用xy参数将标签的位置设置在柱子的中间,而height表示了柱子的高度,因此数据标签会被添加到每个柱子的中间位置,以显示柱子所代表的数据值。

这是一种常见的用法,用于在柱状图中添加数据标签。

2.2 代码解读

解释:xy=(bar.get_x() + bar.get_width() / 2, height)

代码 xy=(bar.get_x() + bar.get_width() / 2, height) 主要用于确定要放置数据标签的位置,具体来说:

  1. bar.get_x() 获取柱子的左边界的 x 坐标。
  2. bar.get_width() 获取柱子的宽度。
  3. bar.get_x() + bar.get_width() / 2 计算出柱子的中心 x 坐标。
  4. height 是柱子的高度,即柱子所代表的数据值。

这行代码将数据标签的位置设置为柱子的中心,横坐标为柱子中心的 x 坐标,纵坐标为柱子的高度,这样标签就会位于柱子的顶部中央,以显示柱子所代表的具体数据值。

例如,假设某个柱子的左边界的 x 坐标是 10,宽度是 2,高度是 20,那么这行代码的计算如下:

  1. bar.get_x() 得到 10。
  2. bar.get_width() 得到 2。
  3. bar.get_x() + bar.get_width() / 2 得到 11,这是柱子的中心 x 坐标。
  4. height 得到 20,柱子的高度。

因此,xy参数被设置为 (11, 20),这是数据标签的位置,使得标签位于柱子的中央顶部,以显示数据值 20。这种方法可确保数据标签位于柱子的合适位置,使得图表更易于理解。

2.3 xytext=(0, 3)

xytext 参数用于指定标签文本的偏移量,它是一个二元组,表示文本相对于 xy 参数指定的坐标的偏移量,其中第一个值表示水平偏移,第二个值表示垂直偏移。

在代码中,xytext=(0, 3) 的含义是:

  • 水平偏移为 0,表示标签文本在水平方向上不进行偏移。
  • 垂直偏移为 3,表示标签文本在垂直方向上相对于 xy 参数指定的坐标向上偏移 3 个单位。

这个偏移的目的是为了让数据标签稍微上移一点,以使标签文本不会与柱子的顶部重叠,从而更清晰地显示数据标签。通过微小的垂直偏移,可以改善标签的可读性,确保它们不会覆盖柱子或其他元素。

您可以根据需要调整 xytext 参数的值,以更好地控制标签的位置和外观。

2.4 textcoords=“offset points”

textcoords="offset points"annotate 函数中的一个参数,用于指定文本注释的坐标系统。具体来说,它告诉函数如何解释 xyxytext 参数中的坐标值。

在这种情况下,textcoords 被设置为 "offset points",意味着 xyxytext 中的坐标值将被解释为以点(points)为单位的偏移量。这是为了方便指定相对于柱子或数据点的偏移量,而不是使用绝对的坐标值。

例如,如果您设置 xy=(11, 20)xytext=(0, 3),那么这意味着:

  • xy=(11, 20) 表示数据标签的基准点位于柱子中心的水平位置 x=11,垂直位置 y=20。
  • xytext=(0, 3) 表示相对于 xy 指定的点,文本标签将向水平和垂直方向分别偏移 0 个点和 3 个点。

通过这种方式,您可以方便地指定相对于数据点的偏移量,以更好地控制标签的位置。如果您选择其他坐标系统,例如 "figure fraction""axes fraction",那么坐标值将被解释为相对于图形或轴的比例位置。

havaannotate 函数中的参数,用于控制文本注释(标签)的水平对齐和垂直对齐方式。

  • ha 表示水平对齐方式,它有以下可能的取值:

    • 'center':文本水平居中对齐,默认值。
    • 'left':文本左对齐。
    • 'right':文本右对齐。
  • va 表示垂直对齐方式,它有以下可能的取值:

    • 'center':文本垂直居中对齐,默认值。
    • 'top':文本顶部对齐。
    • 'bottom':文本底部对齐。

在您提供的代码中,ha='center' 表示文本水平居中对齐,va='bottom' 表示文本底部对齐。这意味着数据标签的文本将以底部对齐到 xy 指定的点。通常,这是一个常见的设置,以确保标签文本在柱子或数据点的底部显示,使其更易于阅读。

如果需要,您可以根据需要更改这些参数,以调整标签的水平和垂直对齐方式,以满足您的可视化需求。例如,将 va 设置为 'center' 将使文本垂直居中对齐,而将 ha 设置为 'left' 将使文本左对齐。

3.标签获取(解读)

for category in normalized_table_T.index:
    for i, value in enumerate(normalized_table_T.loc[category]):
        plt.text(i, value, f'{
      value:.2f}', ha='center', va='bottom', fontsize=10,
                 color=colors[normalized_table_T.index.get_loc(category)])

这段代码主要是用于在图表上为每个数据点添加文本标签。下面是对代码的逐行解读:

  1. for category in normalized_table_T.index::这一行是遍历normalized_table_T的索引,其中normalized_table_T是一个pandas DataFrame。

  2. for i, value in enumerate(normalized_table_T.loc[category])::这一行是遍历给定类别category下的所有值。enumerate用于获取每个值的索引i和值value

  3. plt.text(i, value, f'{value:.2f}', ha='center', va='bottom', fontsize=10, color=colors[normalized_table_T.index.get_loc(category)]):这一行是用于在图表上添加文本标签的。

    • i, value:这是文本标签的位置。i是x坐标,value是y坐标。
    • f'{value:.2f}':这是要显示的文本,它使用f-string格式化,显示value的值并保留两位小数。
    • ha='center', va='bottom':这些是文本对齐选项。ha是水平对齐方式,这里设置为居中;va是垂直对齐方式,这里设置为底部。
    • fontsize=10:设置字体大小为10。
    • color=colors[normalized_table_T.index.get_loc(category)]:设置文本颜色。它从colors列表中获取一个颜色值,这个列表应该事先定义好了。normalized_table_T.index.get_loc(category)获取categorynormalized_table_T索引中的位置,然后用这个位置从colors列表中获取颜色。

总的来说,这段代码遍历一个名为normalized_table_T的DataFrame,并在每个数据点上添加一个显示其值的文本标签,这些标签在图表上是居中且位于数据点的下方,字体大小为10,颜色根据类别从colors列表中获取。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46713695/article/details/133671510

智能推荐

怎样把计算机放到手机桌面壁纸,怎么把待办事项生成电脑桌面壁纸?-程序员宅基地

文章浏览阅读221次。原标题:怎么把待办事项生成电脑桌面壁纸?我的同事张晨喜欢在工作前把每天的工作待办事项一一添加到手机便签中,这样在办公的时候就能随时查看自己的工作内容了,按照待办事项清单去一一完成,这样不仅会让她更有紧迫感和任务感,还能在无形中提高工作效率。但是张晨说了在手机便签中添加工作待办事项不方便的地方,这就是她使用的办公设备是电脑,一般需要在办公的时候,时不时的打开手机查看待办事项,这样也会分散自己的注意力..._待办事项手机壁纸

Unity VR Pico apk安装失败:INSTALL_FAILED_UPDATE_INCOMPATIBLE_pico apk 安装失败-程序员宅基地

文章浏览阅读1.4k次,点赞10次,收藏8次。PICO4企业版。安装apk,报错“安装失败。(所属的Unity项目打包的apk,被我在同一台pico4安装了20次+)_pico apk 安装失败

机器学习实战(七)_loadsimpdata-程序员宅基地

文章浏览阅读265次。title: 机器学习实战(七)date: 2020-04-07 09:20:50tags: [AdaBoost, bagging, boosting, ROC]categories: 机器学习实战更多内容请关注我的博客利用AdaBoost元算法提高分类性能在做决定时,大家可能会吸取多个专家而不是一个人的意见,机器学习也有类似的算法,这就是元算法(meta-algorithm)。元算法是对其他算法进行组合的一种方式。基于数据集多重抽样的分类器前面已经学习了五种不同的分类算法,它们各有优._loadsimpdata

python内置数据结构---字符串_python 中列表 choice.lower()-程序员宅基地

文章浏览阅读217次。字符串str:单引号,双引号,三引号引起来的字符信息。数组array:存储同种数据类型的数据结构。[1, 2, 3], [1.1, 2.2, 3.3]列表list:打了激素的数组, 可以存储不同数据类型的数据结构. [1, 1.1, 2.1, 'hello']元组tuple:带了紧箍咒的列表, 和列表的唯一区别是不能增删改。集合set:不重复且无序的。 (交集和并集)字典dict:{“name”:"westos", "age":10# 1. 字符串str字符串或串(String)是由数字、字母_python 中列表 choice.lower()

超实用可执行程序-PDF文字复制后的回车符去除和谷歌百度英汉翻译-python GUI_文献翻译复制的时候都是回车-程序员宅基地

文章浏览阅读4.1k次,点赞4次,收藏3次。超实用python程序-PDF文字复制后的回车符去除和谷歌百度英汉翻译超实用python程序-PDF文字复制后的回车符去除和谷歌百度英汉翻译痛点界面与功能功能详细说明:过程记录代码和组件分析exe程序生成记录结语痛点PDF文档文字复制会包括回车符,使得文字粘贴和翻译都不方便,尤其是对于双栏的PDF。界面与功能以下为详细说明和..._文献翻译复制的时候都是回车

求正整数N以内的所有勾股数。 所谓勾股数,是指能够构成直角三角形三条边的三个正整数(a,b,c)。_编写程序,计算0到输入的整数n范围内的勾股数。假设3个正整数x、y和z是勾股数,-程序员宅基地

文章浏览阅读291次。#include"stdio.h"void main(){int n;int i,j,k;int count=0;while(scanf("%d",&n)){for(i=1;i<=n;++i)for(j=i+1;j<=n;++j)for(k=j+1;k<=n;++k)if(ii+jj==k*k){printf("[%d,%d,%d], ",i,j,k);count++;}printf(“total number: %d\n”,count);}}_编写程序,计算0到输入的整数n范围内的勾股数。假设3个正整数x、y和z是勾股数,

随便推点

ActiveMQ-cpp客户端程序应用异常退出问题_activemq-cpp客户端stop会奔溃-程序员宅基地

文章浏览阅读1.9k次。笔者使用ActiveMQ作为系统中消息分发的服务器,由Java Web程序读取数据库实时记录作为Producer,接收端为C++Builder开发的客户端程序,常驻客户端右下角,弹窗显示实时消息。测试时发现,当客户端断网(网线拔掉)或者服务器重启等连接中断时,客户端会直接退出,windows也没有报程序崩溃的问题,很是费解。 Debug调试代码发现问题出在自定义的Concumer_activemq-cpp客户端stop会奔溃

php中对类中静态方法和静态属性的学习和理解_静态属性和静态方法的特点-程序员宅基地

文章浏览阅读1.7k次。什么是静态方法或静态属性 static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为“类属性”或“类方法静态方法的特点 1.static方法是类中的一个成员方法,属于整个类,即使不用创建任何对象也可以直接调用! 2.静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。 3.静态方法和..._静态属性和静态方法的特点

遇到问题---thrift--python---ImportError: No module named thrift_importerror:no module named thrift.thrift-程序员宅基地

文章浏览阅读9.1k次。情况我们在启动hbase的thrift服务后使用python来进行测试连接hbase时报错ImportError: No module named thrift。完整报错如下:[root@host252 thrift]# python test.pyTraceback (most recent call last): File "test.py", line 3, in &l..._importerror:no module named thrift.thrift

华科电气专业转计算机专业,华中科技大学转专业-程序员宅基地

文章浏览阅读1k次。关于转专业,华科有两次机会,大一下是可以跨大类转,当然也可以在大类内部转;大二下是只能在学科大类内部转。华科有以下几个大类 信息大类、机械大类、土建环大类、电气大类、文科大类。跨大类转时信息大类与临床医学是不能转入的,但可以通过考光电中法班,通信中英班的方式转入,但是学费要高些,而且毕业是出国的(当然也可以选择不出)。很多同学对船舶与海洋工程不了解,其实这个专业就业非常不错,比信息大类内的不少专业..._华中科技大学转专业机会

spring cloud的RefreshScope注解进行热部署_spring refresh 热部署-程序员宅基地

文章浏览阅读2.5w次,点赞5次,收藏36次。需要热加载的bean需要加上@RefreshScope注解,当配置发生变更的时候可以在不重启应用的前提下完成bean中相关属性的刷新。经由@RefreshScope修饰的bean将会被RefreshScope代理,其关于bean生命周期的相关方法也在此定义。@ManagedOperation(description = "Dispose of the current instanc..._spring refresh 热部署

php抓取网指定内容,php获取网页内容方法总结-程序员宅基地

文章浏览阅读388次。抓取到的内容在通过正则表达式做一下过滤就得到了你想要的内容,至于如何用正则表达式过滤,在这里就不做介绍了,有兴趣的,以下就是几种常用的用php抓取网页中的内容的方法。1.file_get_contentsPHP代码复制代码代码如下:$url="http://www.jb51.net";$contents=file_get_contents($url);//如果出现中文乱码使用下面代码//$getc..._php正则截取file_get_contents里的域名

推荐文章

热门文章

相关标签