QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 7738|回复: 0
打印 上一主题 下一主题

python+matplotlib绘制南丁格尔玫瑰图

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-5-30 15:09 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    " Q" b" _, c# h! O
    python+matplotlib绘制南丁格尔玫瑰图2 K& C. y) j+ w( X/ l
    实验:绘制南丁格尔玫瑰图
    5 ]$ c0 a6 X* @, R4 Z7 \  本实验有一定难度,有人说matplotlib绘图和matlab大同小异,我看除了一些函数名相同之外,其他的像参数和使用方法很不一样.另外我不知道是不是在matlab中画玫瑰图直接一个"肉丝"函数就成了,为什么matplotlib里面没有~~
    : a0 i1 P! I: o; H! O* _) P  无论如何还是感谢本次实验,虽然费了点时间但是我对函数画图有了一定深度的了解和掌握,草草在python之matplotlib库重要绘图函数简介里面记录了一下,因为内容太多没有一一写成博文,但是附加了一些别人博客的链接,还是很有帮助的.
    , q( A6 {- J, R7 w
    , {- J2 U& R, L8 B! H文章目录
    " s9 w5 B1 E+ H. K: w4 d* ?5 ^' D$ j7 [2 E0 L! q
    一、实验目的
    / v  O; o7 I' E0 [' V二、实验内容
    8 W1 T! {; e, C8 v4 @三、实验环境" K- }$ q& o. R4 j3 k# Q* s8 \9 h
    四、实验步骤* q  h4 E' f0 q- ?$ n9 P. _
    五、实验代码及测试$ r, O# W/ x4 Q; Q0 b; p  I+ d5 C* w  N
    1.源代码- z3 m7 E9 ~3 N. l6 Q. [
    2.运行结果
    3 M  k% k5 q' D( M+ T$ }, g3.excel数据表
    ( I6 X* G+ ?6 c& V* t9 n$ [6 e一、实验目的
    / Z7 _6 n0 t6 g" X8 F  L: r/ D- O( U$ V# F' F+ y$ J
      了解玫瑰图的前世今生;了解matplotlib标准库中的pyplot模块;了解在极坐标系中绘制柱状图。; A( k& O8 ~6 w0 E

    " o7 g8 O. [/ P二、实验内容
    1 P/ {& S' ]: O! w( B: E$ t9 E$ y4 X) _/ r- B
      南丁格尔玫瑰图(Nightingale rose diagram)又名鸡冠花图(Coxcomb Chart)或极坐标区域图(Polar area diagram)。它将柱图转化为更美观饼图形式,是极坐标化的柱图。不同于饼图用角度表现数值或占比,南丁格尔玫瑰图使用扇形的半径表示数据的大小,各扇形的角度则保持一致。% x8 O- I& `, d, K) w! M
      自行选择一组数据,画出基础玫瑰图。
    5 q+ C/ F/ J$ D9 X
      r: t" k+ X6 i; x三、实验环境: x7 s9 F5 \* E; `: V
    9 p, V. m9 ^# L# I5 u' d- o5 M8 q
      ython 3.8
    + y9 z" I0 v: q8 H' ^
    7 j9 D  x% t  ^6 h$ g, `5 u( }四、实验步骤
    7 [+ J$ q3 V+ T9 ^: J! r$ E' w. c
    9 p. O- P0 g+ c. R" c1 h# |; R查阅文档,了解南丁格尔玫瑰图的原理。
    6 i! b/ b; h+ n9 A8 G/ B5 F选择一组数据,编写程序画出玫瑰图。! u+ B+ M6 i' n8 i2 B, V
    五、实验代码及测试
    ( Q, |: w( T+ @2 I1 _* T, m
    8 u  Q4 A& i0 z' q1.源代码0 E6 K& V( G+ E% I) t! S, U

    - R  J4 Q: G; e! Timport matplotlib.pyplot as plt2 p  Y* p; i6 s0 E" m
    import numpy as np
    - e! W/ ~/ J/ p5 O) w$ \) s- Pimport xlrd
    6 K* N. g6 ?" ^! e6 `4 r
    ' V' `! Z: [6 P; ]'''
    . y1 |/ \# }5 k9 p+ b& S  [    按列读取excel文件并存入两个列表/ J! D/ N" N% p/ d1 V8 v; `% o9 ~* t
    '''; d/ s3 {, ?# u/ L5 ~4 S& N- i; B% o
    data=xlrd.open_workbook(r'亚洲国家疫情数据.xlsx')
    % F3 o! `+ W9 L2 e4 F' t$ i3 @2 t, ntable  = data.sheets()[0]   #通过索引顺序获取工作表, w( Z& K2 J$ _3 o3 b
    cols_n = table.ncols & l: S) d3 t/ q  G; d- a2 r# m3 ^0 @6 a
    country_list = table.col_values(0,start_rowx=1) # start_rowx默认为0,设置为1去掉列名! V) N7 R1 U5 r
    data_list = table.col_values(1,start_rowx=1)
    5 m' ^6 Q2 \- T) a# |# print(data_list)
    . |$ W6 Q5 K- }! `& Y$ @: Y6 ~, k# a! u3 k4 [3 v
    '''% `6 L4 e1 P" g1 C( Q* ?$ ~
        计算角度& s( I2 b  I# J! D5 o! a
    '''
    - U$ J+ y: _* O% A6 d4 e, dn = table.nrows-1           #去掉列名
    ' d. t  g- h1 e  Q! |5 @4 [theta = np.linspace(0,2*np.pi,len(data_list))    # 360度等分成n份
    : _0 F8 q0 B( N+ `! T3 S/ L: L1 w1 r( V% c* Y1 }
    '''( J* w% o, ?5 C! V$ {. z0 S  V
        作图- P2 E: D+ E# s0 r! Z# f1 X
    '''4 }  E% h$ N  Y7 ]
    # 设置画布1 r; E6 s# W$ J4 |0 ?9 P' @
    fig = plt.figure(figsize=(12,10))5 Q3 R+ C# D$ m% B! x( d
    # 极坐标, U9 r% i8 V/ e5 {( ]3 |& u
    ax = plt.subplot(111,projection = 'polar'). t% t, R$ B' \& N8 q. Y
    # 顺时针并设置N方向为0度
    % H( p8 q6 |' N1 D3 xax.set_theta_direction(-1)! e+ f2 h% L- q7 w9 A
    ax.set_theta_zero_location('N')
    + q# _. n9 @) a7 n9 b% D+ R; @6 h  x
    8 v! j  x% b% P" h# 在极坐标中画柱形图
    + I" F# I5 e' [5 cax.bar(theta,
    1 N5 T- u# O2 a0 i- t! Y. G- q. z        data_list,
    0 z( N1 T6 C  o9 V/ ~$ _/ k/ W9 c        width = 0.33,
    * W/ A3 K$ W* G# M        color = np.random.random((len(data_list),3)),& K) p: i. H$ m8 F: D8 |
            # labels=str(country_list), 0 G# F4 ~7 u. I' m- }6 _8 @" X& ?8 I
            align = 'edge')
    4 v/ q! F; Y( d+ P8 ?'''   Y1 F3 Y% e6 T% C1 C
        显示一些简单的中文图例# X; Q8 D$ Y/ _0 k& ~5 w
    '''" @- r( k! t1 }3 A  J
    plt.rcParams['font.sans-serif']=['SimHei']  # 黑体
    3 X# x) X8 r0 s1 D# e  {$ f) M) aax.set_title('亚洲国家现存确诊',fontdict={'fontsize':20})
    8 B8 l1 g8 d  w# ~. K- F1 _; D2 K6 vfor angle,data in zip(theta,data_list):/ B) i; m/ F7 w; Z, L/ O
        ax.text(angle+0.03,data+100,str(data)) : [0 m# b; @) x7 J; g  O
    ! \$ ^5 F& i1 {. R0 a5 [6 L
    . d6 ?1 N8 E/ x  J
    plt.axis('off')" J4 {4 z1 [2 C: _6 m

    ( M/ b% k- v2 F: Aplt.savefig('Nightingale_rose.png')  f, i2 v! k# s6 L' A# Q
    plt.show()' B# W# |7 J, ]  t
    & f" Q7 j( S7 y+ f5 W, L6 O: F
    9 l3 _$ b% [. C8 o* U0 z- S
    2.运行结果
    $ v# J+ P' c: x2 P# I( _ 1.png
    + e6 u$ i: a, P" T8 d3 [" g' v# ?$ `- E* k' d( j3 c& o) g# T

    9 @% U6 I$ t* Y! k/ W% R4 [3.excel数据表- \& R0 h0 x9 o. z$ K0 I
    2.png . [  Z  B. e3 s! u7 f5 u/ Z
    * c# j5 x* s& R& e2 [
    4.说明+ Q$ P1 R# a, j' a5 Q  n* w" z
      四位数过长,而对应的图所占比例很小,所以在图上的标注有些重叠.
    - v( {" o6 P* F( `  实验让画出基础玫瑰图,并没有图例和标签的要求,而且给玫瑰图设置标签的步骤比较繁琐,所以没有涉及到.7 L5 v  S$ ]* l1 X' x1 X5 ?& |0 V
    ————————————————
    ! c' }& {& b2 R+ D2 H/ |版权声明:本文为CSDN博主「小兰同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& K; A1 A7 o, o- N; c" }3 q
    原文链接:https://blog.csdn.net/weixin_42323041/article/details/106263852
    4 I) h2 n, D' A  z0 T( K: u6 o& L3 E- I

    ( }3 p$ r* a3 r: d* b0 t6 Q
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-20 01:28 , Processed in 0.443961 second(s), 54 queries .

    回顶部