python绘制柱状图,并添加标签
python绘制柱状图,并添加标签
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)
主要用于确定要放置数据标签的位置,具体来说:
bar.get_x()
获取柱子的左边界的 x 坐标。bar.get_width()
获取柱子的宽度。bar.get_x() + bar.get_width() / 2
计算出柱子的中心 x 坐标。height
是柱子的高度,即柱子所代表的数据值。
这行代码将数据标签的位置设置为柱子的中心,横坐标为柱子中心的 x 坐标,纵坐标为柱子的高度,这样标签就会位于柱子的顶部中央,以显示柱子所代表的具体数据值。
例如,假设某个柱子的左边界的 x 坐标是 10,宽度是 2,高度是 20,那么这行代码的计算如下:
bar.get_x()
得到 10。bar.get_width()
得到 2。bar.get_x() + bar.get_width() / 2
得到 11,这是柱子的中心 x 坐标。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
函数中的一个参数,用于指定文本注释的坐标系统。具体来说,它告诉函数如何解释 xy
和 xytext
参数中的坐标值。
在这种情况下,textcoords
被设置为 "offset points"
,意味着 xy
和 xytext
中的坐标值将被解释为以点(points)为单位的偏移量。这是为了方便指定相对于柱子或数据点的偏移量,而不是使用绝对的坐标值。
例如,如果设置 xy=(11, 20)
和 xytext=(0, 3)
,那么这意味着:
xy=(11, 20)
表示数据标签的基准点位于柱子中心的水平位置 x=11,垂直位置 y=20。xytext=(0, 3)
表示相对于xy
指定的点,文本标签将向水平和垂直方向分别偏移 0 个点和 3 个点。
通过这种方式,可以方便地指定相对于数据点的偏移量,以更好地控制标签的位置。如果选择其他坐标系统,例如 "figure fraction"
或 "axes fraction"
,那么坐标值将被解释为相对于图形或轴的比例位置。
ha
和 va
是 annotate
函数中的参数,用于控制文本注释(标签)的水平对齐和垂直对齐方式。
-
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)])
这段代码主要是用于在图表上为每个数据点添加文本标签。下面是对代码的逐行解读:
-
for category in normalized_table_T.index:
:这一行是遍历normalized_table_T
的索引,其中normalized_table_T
是一个pandas DataFrame。 -
for i, value in enumerate(normalized_table_T.loc[category]):
:这一行是遍历给定类别category
下的所有值。enumerate
用于获取每个值的索引i
和值value
。 -
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)
获取category
在normalized_table_T
索引中的位置,然后用这个位置从colors
列表中获取颜色。
总的来说,这段代码遍历一个名为normalized_table_T
的DataFrame,并在每个数据点上添加一个显示其值的文本标签,这些标签在图表上是居中且位于数据点的下方,字体大小为10,颜色根据类别从colors
列表中获取。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)