目录
一、介绍
二、相关库
三、数据准备
四、pyecahrts代码实现
五、matplotlib代码实现
玫瑰图是弗罗伦斯·南丁格尔所发明的。又名为极坐标面积图,是一种圆形的直方图。 南丁格尔自己常昵称这类图为鸡冠花图(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 |
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")
# 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()