查看原文
其他

Python可视化|pygal37-pygal用法及示例

pythonic生物人 pythonic生物人 2022-09-11

"pythonic生物人"的第82篇分享

本文详细介绍python的另一个「可视化库pygal」,pygal比较小众,「注于SVG图」「擅长交互」,可弥补matplotlib和seborn这方面的缺陷。

本文速览

更多教程,欢迎关注@pythonic生物人

目录

一、pygal安装
二、常见图形绘制
1、pygal与jupyter notebook交互设置
2、 折线图line,pygal.Line
3、柱状图bar,pygal.Bar
4、水平柱状图bar,pygal.HorizontalBar
5、堆积柱状图bar,pygal.StackedBar
6、直方图hist,pygal.Histogram
7、散点图scatter,pygal.XY
8、时间序列图,pygal.DateTimeLine
9、饼图pie,pygal.Pie
10、饼图pie,pygal.Pie半圆显示 
11、雷达图radar,pygal.Radar
12、箱图,pygal.Box
13、气泡图dot,pygal.Dot
14、漏斗图funnel,pygal.Funnel
15、仪表盘图,pygal.SolidGauge
16、金字塔图pyramid,pygal.Pyramid 
17、树地图treemap,pygal.Treemap 
三、常见图形参数设置

一、pygal安装


二、常见图形绘制

1、pygal与jupyter notebook交互设置

pygal默认在jupyter notebook不显示,需要保存问svg、png等格式,浏览器打开查看,为了便于展示,做了如下设置可在jupyter notebook中展示。

import pygal

#设置pygal与jupyter notebook交互
from IPython.display import display, HTML

base_html = """
<!DOCTYPE html>
<html>
  <head>
  <script type="text/javascript" src="http://kozea.github.com/pygal.js/javascripts/svg.jquery.js"></script>
  <script type="text/javascript" src="https://kozea.github.io/pygal.js/2.0.x/pygal-tooltips.min.js""></script>
  </head>
  <body>
    <figure>
      {rendered_chart}
    </figure>
  </body>
</html>
"""

2、 折线图line,pygal.Line

from pygal.style import NeonStyle#绘图style导入
line_chart = pygal.Line(height=250,style=NeonStyle)
line_chart.title = 'Browser usage evolution (in %)'
line_chart.x_labels = map(str, range(20022013))#添加x轴标签
line_chart.add('Firefox', [NoneNone,    016.6,   25,   3136.445.546.342.837.1])#传入第一组数据
line_chart.add('Chrome',  [NoneNoneNoneNoneNoneNone,    0,  3.910.823.835.3])
line_chart.add('IE',      [85.884.684.774.5,   6658.654.744.836.226.620.1])
line_chart.add('Others',  [14.215.415.3,  8.9,    910.4,  8.9,  5.8,  6.7,  6.8,  7.5])
HTML(base_html.format(rendered_chart=line_chart.render(is_unicode=True)))#图片渲染

3、柱状图bar,pygal.Bar

#柱状图bar,pygal.Bar
from pygal.style import NeonStyle
line_chart = pygal.Bar(height=250,style=NeonStyle)
line_chart.title = 'Browser usage evolution (in %)'
line_chart.x_labels = map(str, range(20022013))
line_chart.add('Firefox', [NoneNone016.6,   25,   3136.445.546.342.837.1])
line_chart.add('Chrome',  [NoneNoneNoneNoneNoneNone,    0,  3.910.823.835.3])
line_chart.add('IE',      [85.884.684.774.5,   6658.654.744.836.226.620.1])
line_chart.add('Others',  [14.215.415.3,  8.9,    910.4,  8.9,  5.8,  6.7,  6.8,  7.5])
HTML(base_html.format(rendered_chart=line_chart.render(is_unicode=True)))

4、水平柱状图bar,pygal.HorizontalBar

#水平柱状图bar,pygal.HorizontalBar
from pygal.style import NeonStyle
line_chart = pygal.HorizontalBar(height=250,style=NeonStyle)
line_chart.title = 'Browser usage evolution (in %)'
line_chart.x_labels = map(str, range(20022013))
line_chart.add('Firefox', [NoneNone016.6,   25,   3136.445.546.342.837.1])
line_chart.add('Chrome',  [NoneNoneNoneNoneNoneNone,    0,  3.910.823.835.3])
line_chart.add('IE',      [85.884.684.774.5,   6658.654.744.836.226.620.1])
line_chart.add('Others',  [14.215.415.3,  8.9,    910.4,  8.9,  5.8,  6.7,  6.8,  7.5])
HTML(base_html.format(rendered_chart=line_chart.render(is_unicode=True))) 

5、堆积柱状图bar,pygal.StackedBar

#堆积柱状图bar,pygal.StackedBar
from pygal.style import NeonStyle
line_chart = pygal.StackedBar(height=250,style=NeonStyle)
line_chart.title = 'Browser usage evolution (in %)'
line_chart.x_labels = map(str, range(20022013))
line_chart.add('Firefox', [NoneNone016.6,   25,   3136.445.546.342.837.1])
line_chart.add('Chrome',  [NoneNoneNoneNoneNoneNone,    0,  3.910.823.835.3])
line_chart.add('IE',      [85.884.684.774.5,   6658.654.744.836.226.620.1])
line_chart.add('Others',  [14.215.415.3,  8.9,    910.4,  8.9,  5.8,  6.7,  6.8,  7.5])
HTML(base_html.format(rendered_chart=line_chart.render(is_unicode=True)))

6、直方图hist,pygal.Histogram

#直方图hist,pygal.Histogram
from pygal.style import NeonStyle
hist = pygal.Histogram(height=250,style=NeonStyle)
hist.add('Wide bars', [(5010), (4513), (2015)])#每个柱子传入三个参数:纵坐标高、x轴起始点、x轴终止点
hist.add('Narrow bars',  [(1012), (1244.5), (81113)])
HTML(base_html.format(rendered_chart=hist.render(is_unicode=True))) 

7、散点图scatter,pygal.XY

#散点图scatter,pygal.XY
from pygal.style import NeonStyle
xy_chart = pygal.XY(stroke=False,height=250,style=NeonStyle)
xy_chart.title = 'Correlation'
xy_chart.add('A', [(00), (.1.2), (.3.1), (.51), (.8.6), (11.08), (1.31.1), (23.23), (2.432)])
xy_chart.add('B', [(.1.15), (.12.23), (.4.3), (.6.4), (.21.21), (.5.3), (.6.8), (.7.8)])
xy_chart.add('C', [(.05.01), (.13.02), (1.51.7), (1.521.6), (1.81.63), (1.51.82), (1.71.23), (2.12.23), (2.31.98)])
HTML(base_html.format(rendered_chart=xy_chart.render(is_unicode=True)))

8、时间序列图,pygal.DateTimeLine

#时间序列图,pygal.DateTimeLine
from pygal.style import NeonStyle
from datetime import datetime
datetimeline = pygal.DateTimeLine(height=250,style=NeonStyle,
    x_label_rotation=35, truncate_label=-1,
    x_value_formatter=lambda dt: dt.strftime('%d, %b %Y at %I:%M:%S %p'))
datetimeline.add("Serie", [
    (datetime(201312120), 300),
    (datetime(2013112143045), 412),
    (datetime(2013226), 823),
    (datetime(2013222945), 672)
])
HTML(base_html.format(rendered_chart=datetimeline.render(is_unicode=True)))

9、饼图pie,pygal.Pie

#饼图pie,pygal.Pie
from pygal.style import NeonStyle
pie_chart = pygal.Pie(height=250,style=NeonStyle)
pie_chart.title = 'Browser usage in February 2012 (in %)'
pie_chart.add('IE'19.5)
pie_chart.add('Firefox'36.6)
pie_chart.add('Chrome'36.3)
pie_chart.add('Safari'4.5)
pie_chart.add('Opera'2.3)
HTML(base_html.format(rendered_chart=pie_chart.render(is_unicode=True)))

10、饼图pie,pygal.Pie半圆显示

#饼图pie,pygal.Pie半圆显示
from pygal.style import NeonStyle
pie_chart = pygal.Pie(half_pie=True,height=250,style=NeonStyle)
pie_chart.title = 'Browser usage in February 2012 (in %)'
pie_chart.add('IE'19.5)
pie_chart.add('Firefox'36.6)
pie_chart.add('Chrome'36.3)
pie_chart.add('Safari'4.5)
pie_chart.add('Opera'2.3)
HTML(base_html.format(rendered_chart=pie_chart.render(is_unicode=True)))

11、雷达图radar,pygal.Radar

# 雷达图radar,pygal.Radar
from pygal.style import NeonStyle
radar_chart = pygal.Radar(height=550,style=NeonStyle)
radar_chart.title = 'V8 benchmark results'
radar_chart.x_labels = ['Richards''DeltaBlue''Crypto''RayTrace''EarleyBoyer''RegExp''Splay''NavierStokes']
radar_chart.add('Chrome', [639582127520721812464166021238607])
radar_chart.add('Firefox', [747380991170026516361104437979450])
radar_chart.add('Opera', [34722933420352295810182890134669])
radar_chart.add('IE', [4341597914413634102])
HTML(base_html.format(rendered_chart=radar_chart.render(is_unicode=True)))

12、箱图,pygal.Box

from pygal.style import NeonStyle
box_plot = pygal.Box(box_mode="tukey",height=250,style=NeonStyle)#box_mode可选default,1.5IQR,tukey,stdev,pstdev,
box_plot.title = 'V8 benchmark results'
box_plot.add('Chrome', [639582127520721812464166021238607])
box_plot.add('Firefox', [747380991170026516361104437979450])
box_plot.add('Opera', [34722933420352295810182890134669])
box_plot.add('IE', [4341597914413634102])
HTML(base_html.format(rendered_chart=box_plot.render(is_unicode=True)))

13、气泡图dot,pygal.Dot

#气泡图dot,pygal.Dot
#气泡大小随数值大小变化
from pygal.style import NeonStyle
dot_chart = pygal.Dot(x_label_rotation=30,height=250,style=NeonStyle)
dot_chart.title = 'V8 benchmark results'
dot_chart.x_labels = ['Richards''DeltaBlue''Crypto''RayTrace''EarleyBoyer''RegExp''Splay''NavierStokes']
dot_chart.add('Chrome', [-639582127520721812464166021238607])#负值气泡不填充
dot_chart.add('Firefox', [747380991170026516361104437979450])
dot_chart.add('Opera', [34722933420352295810182890134669])
dot_chart.add('IE', [4341597914413634102])
HTML(base_html.format(rendered_chart=dot_chart.render(is_unicode=True)))

14、漏斗图funnel,pygal.Funnel

#漏斗图funnel,pygal.Funnel
from pygal.style import NeonStyle
funnel_chart = pygal.Funnel(height=250,style=NeonStyle)
funnel_chart.title = 'V8 benchmark results'
funnel_chart.x_labels = ['Richards''DeltaBlue''Crypto''RayTrace''EarleyBoyer''RegExp''Splay''NavierStokes']
funnel_chart.add('Opera', [34722933420352295810182890134669])
funnel_chart.add('Firefox', [747380991170026516361104437979450])
funnel_chart.add('Chrome', [639582127520721812464166021238607])
HTML(base_html.format(rendered_chart=funnel_chart.render(is_unicode=True)))

15、仪表盘图,pygal.SolidGauge

#仪表盘图,pygal.SolidGauge
from pygal.style import DarkSolarizedStyle
gauge = pygal.SolidGauge(inner_radius=0.70,height=350,style=DarkSolarizedStyle)#half_pie=True显示半边
percent_formatter = lambda x: '{:.10g}%'.format(x)
dollar_formatter = lambda x: '{:.10g}.format(x)
gauge.value_formatter = percent_formatter

gauge.add('
Series 1', [{'value': 225000, 'max_value': 1275000}],
          formatter=dollar_formatter)
gauge.add('
Series 2', [{'value': 110, 'max_value': 100}])
gauge.add('
Series 3', [{'value': 3}])
gauge.add(
    '
Series 4', [
        {'
value': 51, 'max_value': 100},
        {'
value': 12, 'max_value': 100}])
gauge.add('
Series 5', [{'value': 79, 'max_value': 100}])
gauge.add('
Series 6', 99)
gauge.add('
Series 7', [{'value': 100, 'max_value': 100}])
HTML(base_html.format(rendered_chart=gauge.render(is_unicode=True)))

16、金字塔图pyramid,pygal.Pyramid

#金字塔图pyramid,pygal.Pyramid
from pygal.style import NeonStyle
ages = [(364381358443360172345848334895326914323053312576302015301277309874318295323396332736330759335267345096352685368067381521380145378724388045382303373469365184342869316928285137273553250861221358195884179321171010162594152221148843143013135887125824121493115913113738105612995969160983917756886953862999588645459348818447394109639169363213428432330314373066131332303342360021999201871907516574150911497714171136871315512558116001082710436985197948787799369016422550648394144343329362615),
   (3462053405703426683284753190103128983081532967522896392904662961903038713098863174363154873166963257723316943458153546963548993517273545793417023364213211162922612618742424072294882089391841471626621473611404241343361269291254041227641160041055901008139502190950850367939172952660225932652716465824277238509340483088728053261522393122039206771986919026187571830814458136851294212323110331018310628108031065510482102021016699391013810007101749997946590288806845079417253669862675773),
   (0000000000000000239141213192984581610053160452424035066478286238478916978221127381244141306581407891539511685601799961944712120062252092288862396902459742534592554552607152599802564812522222494672402682384652381672313612238322204592225122200992193012213222297832393362583602711512180632134612076171962271746151608551654101630701573791496981405701317851199361137511069899929489097784136817460592521894337535469296482457520863),
   (000000000000000074392135139067847128571991329108424755828774163907241083751258861415591480611528711597251712981835361961362108312287572387312396162500362517592595932618322648642647022640702581172536782454402413422398432324932261182216442234402198332196592212712271232328652506462617962101362018241931091818311592801452351459291402661330821243501144411046559322385899788007208162645532144408638481322192686721443168991368011508),
   (0000000000000000751715313438354529929521824725225422230731638541646355767083088910251149135614881835192921302362249428843160348739164196461950325709634772888139934411002128091150411918129271364213298140151575117445185911968220969216292254923619252882629327038270392707027750272442590524357225612179420595),
   (0000000000000000680821344984973684014145576546316896988581031112012631614188221372516292331323741425949305320594865487463830991421032111167120621331715238167061823620336234072702432502373343445438080418114449045247468305361658798632246684171086736547733482062873149220794603941139275393174918128775784255797237753674173),
   (0000000000000000015011351373318031580236136324866684987541042212316141521691119788228222732931547357113893242956464664998352885551785654957632577705742756348555935555453266510844934248555470674578944988446244423846267462033696433866317012877025174227022193420638190511707315381137361169010368935083757063600650444030342026122006170912641018),
   (000000000000000046112068179480107720943581515170479590124341503917257190982132424453278133231637281435974964753559588886237567219709567354774904759947622474979720647033068944665276307360899609685875657647563015724657068590275918747549444254097638077329042943129491280202608624069217421949817400157381445113107115681017185307273648853724499369132592657)]

types = ['Males single''Females single',
         'Males married''Females married',
         'Males widowed''Females widowed',
         'Males divorced''Females divorced']

pyramid_chart = pygal.Pyramid(human_readable=True, legend_at_bottom=True,height=350,style=NeonStyle)
pyramid_chart.title = 'England population by age in 2010 (source: ons.gov.uk)'
pyramid_chart.x_labels = map(lambda x: str(x) if not x % 5 else '', range(90))
for type, age in zip(types, ages):
    pyramid_chart.add(type, age)
HTML(base_html.format(rendered_chart=pyramid_chart.render(is_unicode=True)))

17、树地图treemap,pygal.Treemap

#树地图treemap,pygal.Treemap
from pygal.style import NeonStyle
treemap = pygal.Treemap(height=350,style=NeonStyle)
treemap.title = 'Binary TreeMap'
treemap.add('A', [2112421131234None9])
treemap.add('B', [4251034274-10None831])
treemap.add('C', [38335335412])
treemap.add('D', [2318])
treemap.add('E', [121233123,
      431211111])
treemap.add('F', [31])
treemap.add('G', [59.38.112432])
treemap.add('H', [1233])
HTML(base_html.format(rendered_chart=treemap.render(is_unicode=True)))

三、常见图形参数设置

详细见pygal官网。这里介绍部分。

from pygal.style import LightSolarizedStyle
chart = pygal.Bar(margin_bottom=10,#图与低端距离,类似的有上下左右
                  height=450,
                  #style=NeonStyle,#设置绘图风格,pygal拥有23种style,
                  #其它style可选:'BlueStyle', 'CleanStyle', 'DarkColorizedStyle', 'DarkGreenBlueStyle', 'DarkGreenStyle', 'DarkSolarizedStyle', 'DarkStyle', 'DarkenStyle', 'DefaultStyle', 'DesaturateStyle', 'LightColorizedStyle', 'LightGreenStyle', 'LightSolarizedStyle', 'LightStyle', 'LightenStyle', 'NeonStyle', 'ParametricStyleBase', 'RedBlueStyle', 'RotateStyle', 'SaturateStyle', 'SolidColorStyle', 'Style', 'TurquoiseStyle'
                  
                  ##title设置
                  title=u'Some points'#图标题
                  x_title='X Axis',#x轴标题
                  y_title='Y Axis',#y轴标题
                  
                  ##label设置
                  show_x_labels=True,#显示x轴标签
                  x_label_rotation=20,#x轴标签倾斜角度
                  x_labels = list('ABCD'),#自定义x轴标签
                  value_formatter = lambda x: "%.2f" % x,#y轴刻度值格式化输出
                  
                  ##图例legend设置
                  show_legend=True,#开启图例
                  legend_at_bottom=True,#图例放置于底部
                  legend_at_bottom_columns=2,#图例标签显示行数
                  legend_box_size=12,#图例前箱子大小
                  
                  ##坐标轴axis设置
                  include_x_axis=True,#坐标轴开启
                  range=(030),#设置y轴刻度值范围
                  
                  secondary_range=(1025),#第二坐标轴刻度范围
                  xrange=(0,10),#x轴刻度范围
                  
                  
                  
                  
                  ##柱子上text设置
                  print_values=True,#开启柱子上文本
                  print_values_position='top',#文本位置
                  style=LightSolarizedStyle(
                  value_font_family='googlefont:Raleway',#文本字体设置
                  value_font_size=15,#大小
                  value_colors=('red','blue'),#颜色设置
                  ),
                  
                 )
#chart.x_labels = u'αβγδ'#自定义x轴刻度标签
chart.add('line 1', [515108],
          secondary=True,#开启第二坐标轴
         )
chart.add('line 2', [1520811])
HTML(base_html.format(rendered_chart=chart.render(is_unicode=True)))


同系列文章

Python可视化|Matplotlib&Seaborn36(完结篇)

更多教程,欢迎关注@pythonic生物人

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存