目录
一、介绍
二、相关库
三、数据准备
四、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 尝试使容易的事情变得更容易,使困难的事情变得可能。 您只需几行代码就可以生成图表、直方图、功率谱、条形图、误差图、散点图等。 更多的示例,请参见基础绘图例子和示例陈列馆。
三、数据准备
数据的格式跟饼图类似,此处采用的是各国疫情累计确诊病例数。
四、pyecahrts代码实现
import pandas as pdfrom pyecharts.charts import Piefrom 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° 方向为 Nax.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 / 6color=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()