如何使用Matplotlib模块的text函数给柱形图添加美丽的标签数据?
1 简单引入
在进行数据分析时,当一些图表数据,比如柱形图我们想让它更直观的显示一些内容,有时候会给柱形图添加标签, 那如何实现这样的效果呢? 还有比如我们把某手机品牌1-12月每月的销量制作成柱形图,那如何在柱形图上显示具体的每月销量的标签? 带着这个问题,我们来研究下这个功能吧; 本文使用的是Python
的Matplotlib
模块的text()
函数,它能给图表的指定位置添加标签、注释或标注。
2 关于text()函数
2.1 Matplotlib安装
text()
函数是Python
的Matplotlib
模块一个函数;具体引入的话,需要先安装Matplotlib
模块:
pip install matplotlib
2.2 text()引入
import matplotlib. pyplot as plt
plt. text( )
2.3 text()源码
Python37\Lib\site- packages\matplotlib\pyplot. py
@_copy_docstring_and_deprecators ( Axes. text)
def text ( x, y, s, fontdict= None , ** kwargs) :
return gca( ) . text( x, y, s, fontdict= fontdict, ** kwargs)
2.4 text()参数说明
参数 说明 x, y:float
放置文本的位置 s: str
文本 Fontdict
:默认无覆盖默认文本属性的字典 **kwargs
文本属性
2.5 text()两个简单示例
import matplotlib. pyplot as plt
plt. figure( figsize= ( 5 , 5 ) )
plt. text( 0.5 , 0.5 , "这是一个标签" )
plt. show( )
结果显示如下,发现中文是乱码的: 要解决中文乱码,我们加一行代码:
plt. rcParams[ 'font.sans-serif' ] = [ 'SimHei' ]
之后显示如下: 示例2:我们添加几个点数据,并设置文本数据:
import matplotlib. pyplot as plt
plt. figure( figsize= ( 5 , 5 ) )
x = [ 1 , 2 , 6 ]
x_pos = 1
y_pos = 1.5
plt. text( x_pos, y_pos, "这是一个标签" )
plt. plot( x)
plt. rcParams[ 'font.sans-serif' ] = [ 'SimHei' ]
plt. show( )
结果显示如下:
3 柱形图绘制并添加标签
3.1 目标数据
我们先创建一个产品0-12月份的每月销量数据表plt_text.xlsx
:
月份 销量
1 月 1200
2 月 2400
3 月 112
4 月 125
5 月 555
6 月 135
7 月 136
8 月 269
9 月 627
10 月 876
11 月 350
12 月 233
3.2 读取excel数据
class TestPltText ( ) :
def __init__ ( self) :
super ( TestPltText, self) . __init__( )
self. data = "./plt_text.xlsx"
self. data_excel = pd. DataFrame( pd. read_excel( self. data) )
self. data_content = self. data_excel[ [ "月份" , "销量" ] ]
self. data_content01 = self. data_content. sort_values( "销量" , ascending= True )
3.3 设置窗口大小和xy轴坐标
def test_plt_text ( self) :
plt. figure( figsize= ( 5 , 4 ) )
y = np. array( list ( self. data_content01[ "销量" ] ) )
x_ticks = list ( self. data_content01[ "月份" ] )
x = range ( len ( x_ticks) )
3.4 绘制柱形图
plt. bar( x, y, width= 0.5 , align= "center" , color= "b" , alpha= 0.6 )
plt. xticks( range ( len ( x_ticks) ) , x_ticks, fontsize= 6 , rotation= 90 )
3.5 设置标签
plt. xlabel( '月份' )
plt. ylabel( '销量' )
plt. title( '月销量(万)' )
for label1, label2 in zip ( x, y) :
plt. text( label1, label2+ 10 ,
'%.0f' % label2,
ha= 'center' ,
va= 'bottom' ,
fontsize= 9 )
3.6 解决乱码和结果显示
plt. ylim( 0 , 2600 )
plt. rcParams[ 'font.sans-serif' ] = [ 'SimHei' ]
plt. show( )
4 完整源码
import pandas as pd
import numpy as np
import matplotlib. pyplot as plt
import random
class TestPltText ( ) :
def __init__ ( self) :
super ( TestPltText, self) . __init__( )
self. data = "./plt_text.xlsx"
self. data_excel = pd. DataFrame( pd. read_excel( self. data) )
self. data_content = self. data_excel[ [ "月份" , "销量" ] ]
self. data_content01 = self. data_content. sort_values( "销量" , ascending= True )
def test_plt_text ( self) :
plt. figure( figsize= ( 5 , 4 ) )
y = np. array( list ( self. data_content01[ "销量" ] ) )
x_ticks = list ( self. data_content01[ "月份" ] )
x = range ( len ( x_ticks) )
plt. bar( x, y, width= 0.5 , align= "center" , color= "b" , alpha= 0.6 )
plt. xticks( range ( len ( x_ticks) ) , x_ticks, fontsize= 6 , rotation= 90 )
plt. xlabel( '月份' )
plt. ylabel( '销量' )
plt. title( '月销量(万)' )
for label1, label2 in zip ( x, y) :
plt. text( label1, label2+ 10 ,
'%.0f' % label2,
ha= 'center' ,
va= 'bottom' ,
fontsize= 9 )
plt. ylim( 0 , 2600 )
plt. rcParams[ 'font.sans-serif' ] = [ 'SimHei' ]
plt. show( )
if __name__ == "__main__" :
plt_text = TestPltText( )
plt_text. test_plt_text( )
5 结果显示
5.1 从小到大排序
self. data_content01 = self. data_content. sort_values( "销量" , ascending= True )
结果显示:
5.2 从大到小排序
self. data_content01 = self. data_content. sort_values( "销量" , ascending= True )
plt. bar( x, y, width= 0.5 , align= "center" , color= "c" , alpha= 0.6 )
结果显示:
5.3 原序列输出显示
y = np. array( list ( self. data_content[ "销量" ] ) )
x_ticks = list ( self. data_content[ "月份" ] )
x = range ( len ( x_ticks) )
plt. bar( x, y, width= 0.5 , align= "center" , color= "k" , alpha= 0.6 )
结果显示: