【Python数据分析】如何使用matplotlib和pyecharts制作南丁格尔玫瑰图

目录


原文作者:我辈理想
版权声明:文章原创,转载时请务必加上[原文超链接](https://blog.csdn.net/qq_15028721?spm=1010.2135.3001.5421)、作者信息和本声明。

一、介绍

玫瑰图是弗罗伦斯·南丁格尔所发明的。又名为极坐标面积图,是一种圆形的直方图。 南丁格尔自己常昵称这类图为鸡冠花图(coxcomb),适用于绘制比较、随时间变化的循环现象。和传统的饼图展示形式单一相比,南丁格尔玫瑰图更加绚丽,给人的感觉更直观、深刻,因此,南丁格尔玫瑰图在数据可视化领域的应用十分广泛。

文章介绍如何使用python制作玫瑰图,提供了2中方式:pyecharts生成html和matplotlib生成png。数据展示相对容易,中间的空心圆需要根据情况调整。

二、相关库

电脑系统:windows

编程语言:python

使用的库:pandas、pyecharts、matplotlib

pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,pyecharts 是为了与 Python 进行对接,方便在 Python 中直接使用数据生成图。使用pyecharts可以生成独立的网页,也可以在flask、django中集成使用。

Matplotlib是一个Python 2D绘图库,它以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形。 Matplotlib可用于Python脚本,Python和IPython (opens new window)Shell、Jupyter (opens new window)笔记本,Web应用程序服务器和四个图形用户界面工具包。Matplotlib 尝试使容易的事情变得更容易,使困难的事情变得可能。 您只需几行代码就可以生成图表、直方图、功率谱、条形图、误差图、散点图等。 更多的示例,请参见基础绘图例子和示例陈列馆。

三、数据准备

数据的格式跟饼图类似,此处采用的是各国疫情累计确诊病例数。

疫情地区累计
美国178883533
印度100048254
巴西71639125
俄罗斯27912206
法国24429907
土耳其19820908
英国19771679
意大利19217810
西班牙181744811
阿根廷153137412
哥伦比亚148207213
德国1469991

四、pyecahrts代码实现

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

# 读入数据,需要更改
df = pd.read_excel(r"C:\Users\lpf_a\PycharmProjects\ybt_clan\untitled1\30国.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")

五、matplotlib代码实现


# 1.中文
matplotlib.rcParams['font.sans-serif'] = ['simsun']  # 显示字体为宋体

# 2.数据
df = pd.read_excel(r"C:\Users\lpf_a\PycharmProjects\ybt_clan\untitled1\30国.xlsx")
df = df.sort_values("累计")
p = df['疫情地区'].values.tolist()
r = df['累计'].values.tolist()

# 3.画图
fig = plt.figure(figsize=(10, 6),  # 画布大小
                 dpi=400,  # 分辨率
                 facecolor='lightyellow',  # 背景色
                 )
# 4.
ax = plt.axes(polar=True)  # 实例化极坐标系
# ax = plt.subplot(111, projection="polar")  # polar 投影(扫描方式,自正北方向顺时针)
ax.set_theta_zero_location("N")  # 极坐标 0° 方向为 N
ax.set_theta_direction(-1)  # 顺时针为极坐标正方向
theta = np.linspace(0, np.pi * 2, len(r), endpoint=False)  # 等分极坐标系
# 5.添加饼图
ax.bar(x=theta,  # 柱体的角度坐标
       height=r,  # 柱体的高度, 半径坐标
       width=np.pi / 6,  # 柱体的宽度  np.pi / 6
       color=np.random.random((len(r), 3)),  # 随机产生颜色
       align="edge")  # 原理圆心,设置偏离距离

# 绘制中心空白
ax.bar(x=theta,  # 柱体的角度坐标
       height=13000000,  # 柱体的高度, 半径坐标
       width=np.pi / 6,  # 柱体的宽度
       color='white')
# 标注
ax.set_title('感染累计', fontdict={'fontsize': 20})
for angle, height, text in zip(theta, r, p):
    ax.text(angle + 0.25, height + 120, str(text), fontsize=9)  # 设置显示文本的位置以及字体大小

plt.axis("off")
plt.savefig("南丁格尔图.png")
plt.show()

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年6月15日
下一篇 2023年6月15日

相关推荐