【Python数据分析——使用matplotlib制作南丁格尔玫瑰图】

目录

一、介绍

二、相关库

三、数据准备

四、pyecahrts代码实现

五、matplotlib代码实现


一、介绍

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

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

【Python数据分析——使用matplotlib制作南丁格尔玫瑰图】_第1张图片

二、相关库

电脑系统: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()

你可能感兴趣的:(Python开始入门,python,matplotlib,数据分析)