背景:
最近在工作中接触到了数据分析,其中需要绘制折线图,在经过一番查找和改善之后,最终写了一个自用的函数,在此特做保留,以防丢失
目录
Code
def plt_show ( x: dict ,
y: Union[ dict , List[ dict ] ] ,
size: Tuple[ int , int ] ,
subplot: Tuple[ int , int ] = ( 2 , 2 ) ,
isSubplot: bool = True ) - > None :
"""
根据传入的数据进行折线图的绘制
:param x: x轴坐标数据
x = dict(
data=, # 数据集
name= # x轴名称
xlim=(1, 100) # x轴数据范围
)
:param y: y轴需要绘制的数据
y = dict(
data=, # 数据集
name=, # y轴名称
line="r-", # 绘制线条及颜色,r:red, -:直线,其余样式自行网查
label=, # 表格上提示部分的线段名称
title= # 表格title
)
:param size: 画布大小
size = (8, 4) # width, height
:param subplot: 同时绘制图表的网格尺寸, 当isSubplot为True是才需要设置, 默认设置(2, 2)
subplot = (2, 2) # 在2*2的网格中分别绘制图表
:param isSubplot: 是否使用网格绘制图表
isSubplot: True/False
:return: None
"""
x_data = x[ "data" ]
x_name = x. get( "name" , "" )
x_lim = x. get( "xlim" , None )
if not size or not all ( [ isinstance ( x, int ) for x in size] ) :
size = ( 8 , 4 )
plt. figure( figsize= size)
plt. rcParams[ "font.sans-serif" ] = [ "simHei" ]
plt. xlabel( x_name)
if isinstance ( y, dict ) :
y = [ y]
data_length = len ( y)
start_index = 1
for y_ in y:
if start_index > data_length:
break
y_data = y_[ "data" ]
y_name = y_. get( "name" , "" )
y_lim = y_. get( "ylim" , None )
line_type = y_. get( "line" , "b-" )
line_label = y_. get( "label" , None )
title = y_. get( "title" , None )
if isSubplot:
plt. subplot( subplot[ 0 ] , subplot[ 1 ] , start_index)
plt. plot( x_data, y_data, line_type, label= line_label)
plt. ylabel( y_name)
plt. xticks( rotation= 90 )
plt. title( title)
if y_lim and isinstance ( y_lim, Iterable) and all ( [ isinstance ( i, Number) for i in x_lim] ) :
plt. ylim( y_lim[ 0 ] , y_lim[ 1 ] )
start_index += 1
if x_lim and isinstance ( x_lim, Iterable) and all ( [ isinstance ( i, Number) for i in x_lim] ) :
plt. xlim( x_lim[ 0 ] , x_lim[ 1 ] )
plt. legend( )
plt. show( )
使用示例
_date = dict ( data= data_0_reversed[ "日期" ] , name= "日期" )
_fans= dict ( data= list ( data_0_reversed[ "主播粉丝数" ] ) , name= "主播粉丝数" , line= "b-" , label= "粉丝数" , title= "主播粉丝增长曲线" )
_anchor_time = dict ( data= list ( map ( lambda x: format_time( x) [ "hours" ] , data_0_reversed[ "直播时长" ] ) ) , name= "直播时长" , line= "r-" , label= "直播时长" , title= "主播直播时长曲线" )
plt_show( x= _date, y= [ _fans, _anchor_time] , size= ( 16 , 8 ) , subplot= ( 2 , 2 ) )
示例图
这里的x轴未做处理,待完善优化
写在后面
这里的图片都是每组数据绘制一张表格,另外还有一种多种曲线绘制在一张表格中,其中设计到每组数据的y轴刻度不同,网上找了一段代码,但觉得灵活度不够,所以自己根据代码的思路重构优化了下,详情请看下集。