Python绘制更漂亮的饼图条形图两和——南丁格尔玫瑰图(请叫它口哨条形图)以及饼棒图(Bar of pie)

Python绘制更漂亮的饼图条形图两和——南丁格尔玫瑰图(请叫它口哨条形图)以及饼棒图(Bar of pie)

先看效果

南丁格尔玫瑰图(请叫它口哨条形图)

假设一个场景,你们项目组给500家客户发出邀请函,邀请他们加入一个群聊,日后要举办线下论坛。现在统计出的入群情况及未入群原因相关数据如下:

类别企业数
不需要108
电话无法接通92
电话无人接听87
无效电话82
询问负责人再答复47
待验证35
已明确入群信息26
对方接听人员无法回答8
拒绝沟通7
经营困难4
可能已入群3
已加入其他服务机构1

要直观地展示数据所包含信息,使用本文要介绍的南丁格尔玫瑰图(请叫它口哨条形图)效果如下:
南丁格尔

饼棒图(Bar of pie)

对数据观察发现,可做如下整理:
二级类别
计算一级类别各企业数占总企业数比例以及各二级类别在所在一级类别中的占比,使用本文要介绍的饼棒图(Bar of pie)绘制效果如下:
二级类别

应用场景

一般饼图和条形图太简单,不漂亮,想让绘制出的统计图更炫酷,更直观,更引人注意?南丁格尔玫瑰图(请叫它口哨条形图)以及饼棒图(Bar of pie)是很好的选择。
如果项目类别较少,各类别数据差异较大小,那一般饼图和条形图就能很直观地展示数据信息。但是,如果项目类别较多,各类别数据差异较大,那一般饼图和条形图便就不那么直观与美观喽,南丁格尔玫瑰图(请叫它口哨条形图)以及饼棒图(Bar of pie)便有了超级英雄的用武之地。

代码示例

南丁格尔玫瑰图(请叫它口哨条形图)

要实现上述效果,代码如下:

import pandas as pd
from pyecharts.charts import Pie
from pyecharts import options as opts

# 读入数据,需要更改
df = pd.read_excel("入群统计结果.xlsx")
df = df.sort_values("企业数")
v = df['类别'].values.tolist()
d = df['企业数'].values.tolist()
# 设置颜色
color_series = ['#FAE927', '#E9E416', '#C9DA36', '#9ECB3C', '#6DBC49',
                '#37B44E', '#3DBA78', '#14ADCF', '#209AC9', '#1E91CA',
                '#2C6BA0', '#2B55A1']
"""'#2D3D8E', '#44388E', '#6A368B'
                '#7D3990', '#A63F98', '#C31C88', '#D52178', '#D5225B',
                '#D02C2A', '#D44C2D', '#F57A34', '#FA8F2F', '#D99D21',
                '#CF7B25', '#CF7B25', '#CF7B25']"""
# 实例化Pie类
pie1 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px'))
# 设置颜色
pie1.set_colors(color_series)
# 添加数据,设置饼图的半径,是否展示成南丁格尔图
pie1.add("222", [list(z) for z in zip(v, d)],
         radius=["15%", "100%"],
         center=["50%", "60%"],
         rosetype="area"
         )
# 设置全局配置项
pie1.set_global_opts(title_opts=opts.TitleOpts(title='玫瑰图'),
                     legend_opts=opts.LegendOpts(is_show=False),
                     toolbox_opts=opts.ToolboxOpts())
# 设置系列配置项
pie1.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="inside", font_size=12,
                                               formatter="{b}:{c}", font_style="italic",
                                               font_weight="bold", font_family="Microsoft YaHei"
                                               ),
                     )
# 生成html文档
pie1.render("南丁格尔玫瑰图.html")

参考了我辈理想(https://blog.csdn.net/qq_15028721?spm=1010.2135.3001.5421)部分内容。

饼棒图(Bar of pie)

要实现上述效果,代码如下:

#########高级分层饼图+柱图含比例###############
import matplotlib.pyplot as plt
from matplotlib.patches import ConnectionPatch
import numpy as np

plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False

# make figure and assign axis objects
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(9, 5),dpi=300)
fig.subplots_adjust(wspace=0)

# pie chart parameters
overall_ratios = [.522, .478]
labels = ['未取得联系', '取得联系']
explode = [0.1, 0]
# rotate so that first wedge is split by the x-axis
angle = -180 * overall_ratios[0]
wedges, *_ = ax1.pie(overall_ratios, autopct='%1.1f%%', startangle=angle,
                     labels=labels, explode=explode)

# bar chart parameters
age_ratios = [.35, .33, .32]
age_labels = ['电话无法接通', '电话无人接听', '无效电话']
bottom = 1
width = .2

# Adding from the top matches the legend.
for j, (height, label) in enumerate(reversed([*zip(age_ratios, age_labels)])):
    bottom -= height
    bc = ax2.bar(0, height, width, bottom=bottom, color='C0', label=label,
                 alpha=0.1 + 0.25 * j)
    ax2.bar_label(bc, labels=[f"{height:.0%}"], label_type='center')

ax2.set_title('二级类别')
ax2.legend()
ax2.axis('off')
ax2.set_xlim(- 2.5 * width, 2.5 * width)

# use ConnectionPatch to draw lines between the two plots
theta1, theta2 = wedges[0].theta1, wedges[0].theta2
center, r = wedges[0].center, wedges[0].r
bar_height = sum(age_ratios)

# draw top connecting line
x = r * np.cos(np.pi / 180 * theta2) + center[0]
y = r * np.sin(np.pi / 180 * theta2) + center[1]
con = ConnectionPatch(xyA=(-width / 2, bar_height), coordsA=ax2.transData,
                      xyB=(x, y), coordsB=ax1.transData)
con.set_color([0, 0, 0])
con.set_linewidth(4)
ax2.add_artist(con)

# draw bottom connecting line
x = r * np.cos(np.pi / 180 * theta1) + center[0]
y = r * np.sin(np.pi / 180 * theta1) + center[1]
con = ConnectionPatch(xyA=(-width / 2, 0), coordsA=ax2.transData,
                      xyB=(x, y), coordsB=ax1.transData)
con.set_color([0, 0, 0])
ax2.add_artist(con)
con.set_linewidth(4)

plt.show()

参考了matplotlib官网示例。

注意事项

南丁格尔

1.本问上述代码中读取数据为.xlsx格式,在读取数据后使用代码进行了升序排序(这样绘制出来后神似口哨)在具体绘制时,请注意!
2.输出内容以.htlm格式保存在相应文件夹中,可以在浏览器中打开查看。如果要以图片格式插入到word或ppt中,虽然有下载成图片格式,但推荐直接截图,具体原因请自行试验!

饼棒图

1.绘制时直接根据数据计算出相关比例,在代码中直接填写比例能够更便捷简单地达到预期效果。
2.本文代码中不用读取数据,直接改掉相关比例即可。

细节参数调整

代码中有关参数设置问题以及其他问题欢迎留言,看到后必回复。

嫌代码太麻烦?简单有效,快速绘制的替代方法

网站 花火https://hanabi.cn/h2/dataVideo

该网站可以根据模板直接绘图,但是有水印,自主编辑性较差。

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值