飞道的博客

惊叹,Pyecharts绘制饼图原来可以如此漂亮!

477人阅读  评论(0)

来源:Python数据之道

作者:Peter

整理:Lemon

利用Pyecharts玩转饼图

饼图在实际的可视化要求中是非常常见的,它能够很好显示个体的占比或者数据情况。本文中讲解的是如何利用 pyecharts 来绘制各种满足不同需求的饼图,包含:

  • 基础饼图+改变饼图位置颜色

  • 环状饼图

  • 内嵌饼图

  • 多饼图

  • 玫瑰图


开始之前,先来看看部分效果:

注:文末提供本文的源码获取方式,供大家练习

导入库

本文中使用的还是 pandas+pyecharts 组合,在jupyter notebook 中进行绘图。首先导入所需要的各种库:

基础饼图

模拟数据

我们自行模拟了一份消费数据,包含5个消费项目:住宿+餐饮+交通+服装+红包,具体数据如下:


   
  1. # 生成数据
  2. df = pd.DataFrame({ "消费":[ "住宿", "餐饮", "交通", "服装", "红包"],
  3.                     "数据":[ 2580, 1300, 500, 900, 1300]
  4.                   })
  5. df

将消费和数据中的具体数据转成列表形式:

绘图

代码的具体解释见注释:


   
  1. c = (
  2.     Pie()
  3.     .add( "", [list(z)  for z in zip(x_data, y_data)])   # zip函数两个部分组合在一起list(zip(x,y))-----> [(x,y)]
  4.     .set_global_opts(title_opts=opts.TitleOpts(title= "Pie-月度开支"))  # 标题
  5.     .set_series_opts(label_opts=opts.LabelOpts(formatter= "{b}: {c}"))  # 数据标签设置
  6. )
  7. c.render_notebook()  

改变位置和颜色

上面生成的饼图是使用 pyecharts 自带的颜色和位置,有时候我们需要做下改变:

现在我们生成的饼图如下显示:

  • 颜色变成了我们设置的颜色

  • 位置更靠左了

视频效果如下:

改变图例位置

数据生成

上面的图例是水平方向排列的,而且个数比较少。如果我们的图例比较多,需要改成竖直方向,同时实现翻页滚动功能。

在这里我们使用的是 pyecharts 中自带的数据:

1、Faker.choose() :是用来生成数据标签,有3种不同的取值情况

2、Faker.values() 是用来生成具体的数据,随机生成

绘图

还是通过上面的绘图方法,加入数据同时添加各种配置项:

视频效果如下:

环状饼图

环状饼图主要是通过 add 方法中的 radius 参数来实现的。实现过程如下:


   
  1. x_data = [ "小明""小红""张三""李四""王五"]
  2. y_data = [ 335310234135548]
  3. c = (
  4.     Pie(init_opts=opts.InitOpts(width= "1600px", height= "1000px"))   # 图形的大小设置
  5.     .add(
  6.         series_name= "访问来源",
  7.         data_pair=[list(z)  for z in zip(x_data, y_data)],
  8.         radius=[ "15%""50%"],   # 饼图内圈和外圈的大小比例
  9.         center=[ "30%""40%"],   # 饼图的位置:左边距和上边距
  10.         label_opts=opts.LabelOpts(is_show=True),   # 显示数据和百分比  
  11.     )
  12.     .set_global_opts(legend_opts=opts.LegendOpts(pos_left= "left", orient= "vertical"))   # 图例在左边和垂直显示
  13.     .set_series_opts(
  14.         tooltip_opts=opts.TooltipOpts(
  15.             trigger= "item", formatter= "{a} <br/>{b}: {c} ({d}%)"
  16.         ),
  17.     )
  18. c.render_notebook()

可以看到图形的中间是空的

内嵌饼图

内嵌饼图是指将两个甚至多个环状饼图放在一起,实现代码过程如下:


   
  1. import pyecharts.options as opts
  2. from pyecharts.charts  import Pie
  3. from pyecharts.globals  import ThemeType
  4. # 内部饼图
  5. inner_x_data = [ "直达""营销广告""搜索引擎", "产品"]
  6. inner_y_data = [ 335679548283]
  7. inner_data_pair = [list(z)  for z in zip(inner_x_data, inner_y_data)]
  8. # [[ '直达'335], [ '营销广告'679], [ '搜索引擎'1548], [‘产品’,  283]]
  9. # 外部环形(嵌套)
  10. outer_x_data = [ "搜索引擎""邮件营销""直达""营销广告""联盟广告""视频广告""产品""百度""谷歌", "邮件营销""联盟广告"]
  11. outer_y_data = [ 335135147102220310234135648251]
  12. outer_data_pair = [list(z)  for z in zip(outer_x_data, outer_y_data)]
  13. c = (
  14.      # 初始化
  15.     Pie(init_opts=opts.InitOpts(
  16.         width= "900px",  # 设置图形大小
  17.         height= "800px",
  18.         theme=ThemeType.SHINE))  # 选择主题
  19.     # 内部饼图
  20.     .add(
  21.         series_name= "版本3.2.1",  # 图形名称
  22.         center=[ "50%""35%"],  # 饼图位置
  23.         data_pair=inner_data_pair,  # 系列数据项,格式为 [(key1, value1), (key2, value2)]
  24.         radius=[ "25%""40%"],  # 饼图半径 数组的第一项是内半径,第二项是外半径
  25.         label_opts=opts.LabelOpts(position= 'inner'), # 标签设置在内部
  26.     )
  27.     # 外部嵌套环形图
  28.     .add(
  29.         series_name= "版本3.2.9",  # 系列名称
  30.         center=[ "50%""35%"],  # 饼图位置
  31.         radius=[ "40%""60%"],  # 饼图半径 数组的第一项是内半径,第二项是外半径
  32.         data_pair=outer_data_pair, # 系列数据项,格式为 [(key1, value1), (key2, value2)]
  33.         # 标签配置项 
  34.         label_opts=opts.LabelOpts(
  35.             position= "outside",
  36.             formatter= "{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c}  {per|{d}%}  ",
  37.             background_color= "#eee",
  38.             border_color= "#aaa",
  39.             border_width= 1,
  40.             border_radius= 4,
  41.             rich={
  42.                  "a": { "color""#999",
  43.                        "lineHeight"22,
  44.                        "align""center"},
  45.                  "abg": {
  46.                      "backgroundColor""#e3e3e3",
  47.                      "width""100%",
  48.                      "align""right",
  49.                      "height"22,
  50.                      "borderRadius": [ 4400],
  51.                 },
  52.                  "hr": {
  53.                      "borderColor""#aaa",
  54.                      "width""100%",
  55.                      "borderWidth"0.5,
  56.                      "height"0,
  57.                 },
  58.                  "b": { "fontSize"16"lineHeight"33},
  59.                  "per": {
  60.                      "color""#eee",
  61.                      "backgroundColor""#334455",
  62.                      "padding": [ 24],
  63.                      "borderRadius"2,
  64.                 },
  65.             },
  66.         ),
  67.     )
  68.     # 全局配置项
  69.     .set_global_opts(
  70.         xaxis_opts = opts.AxisOpts(is_show = False),   #隐藏X轴刻度
  71.         yaxis_opts = opts.AxisOpts(is_show = False),    #隐藏Y轴刻度
  72.         legend_opts = opts.LegendOpts(is_show = True),  #隐藏图例
  73.         title_opts = opts.TitleOpts(title = None),    #隐藏标题
  74.                     )
  75.     # 系统配置项
  76.     .set_series_opts(
  77.         tooltip_opts=opts.TooltipOpts(
  78.             trigger= "item",
  79.             formatter= "{a} <br/>{b}: {c} ({d}%)"
  80.         ),
  81.         label_opts=opts.LabelOpts(is_show=True)  # 隐藏每个触角标签
  82.     )
  83. )
  84. c.render_notebook()
视频效果如下:

多饼图

有时候我们需要将多个图形放在一个大画布中,需要用到子图的制作。

在下面的代码中每个 add() 都是一个图形的绘制,我们绘制了4个饼图;同时center指定每个图形的位置,radius指定每个饼图内外圈的大小


   
  1. c = (
  2.     Pie()
  3.     .add(
  4.          "",
  5.         [list(z)  for z in zip([ "剧情""其他"], [ 3070])],
  6.         center=[ "20%""30%"],  # 位置
  7.         radius=[ 6080],   # 每个饼图内外圈的大小
  8.     )
  9.     .add(
  10.          "",
  11.         [list(z)  for z in zip([ "奇幻""其他"], [ 4060])],
  12.         center=[ "55%""30%"],
  13.         radius=[ 6080],
  14.     )
  15.     .add(
  16.          "",
  17.         [list(z)  for z in zip([ "爱情""其他"], [ 2476])],
  18.         center=[ "20%""70%"],
  19.         radius=[ 6080],
  20.     )
  21.     .add(
  22.          "",
  23.         [list(z)  for z in zip([ "惊悚""其他"], [ 1189])],
  24.         center=[ "55%""70%"],
  25.         radius=[ 6080],
  26.     )
  27.     .set_global_opts(
  28.         title_opts=opts.TitleOpts(title= "Pie-多饼图基本示例"),
  29.         legend_opts=opts.LegendOpts(
  30.             type_= "scroll", pos_top= "20%", pos_left= "80%", orient= "vertical"
  31.         ),
  32.     )
  33. )
  34. c.render_notebook()
视频效果如下:

玫瑰图

玫瑰图中每个部分的大小和粗细都是不同的


   
  1. v = Faker.choose()
  2. c = (
  3.     Pie()
  4.     .add(
  5.          "",
  6.         [list(z)  for z in zip(v, Faker.values())],   # 两个值
  7.         radius=[ "30%""60%"],  # 大小
  8.         center=[ "25%""50%"],  # 位置
  9.         rosetype= "radius",   
  10.         label_opts=opts.LabelOpts(is_show=False),  # 不在图形上显示数据
  11.     )
  12.     .add(
  13.          "",
  14.         [list(z)  for z in zip(v, Faker.values())],
  15.         radius=[ "30%""60%"],
  16.         center=[ "75%""50%"],
  17.         rosetype= "area",
  18.     )
  19.     .set_global_opts(title_opts=opts.TitleOpts(title= "Pie-玫瑰图示例"))
  20. )
  21. c.render_notebook()
视频效果如下:

作者简介

Peter,硕士毕业僧一枚,从电子专业自学Python入门数据行业,擅长数据分析及可视化。喜欢数据,坚持跑步,热爱阅读,乐观生活。个人格言:不浮于世,不负于己

个人站点:www.renpeter.cn,欢迎常来小屋逛逛


本文来自公众号读者投稿,欢迎各位童鞋向公号投稿,点击下面图片了解详情!

源码文件获取

为方便大家练习,已将整理好的源代码(jupyter notebook文件)分享给各位同学,大家可以在下面的公众号 「柠檬数据」 回复 pie2020 来获取。


转载:https://blog.csdn.net/lemonbit/article/details/111148340
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场