QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 7730|回复: 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

    9 N% J* t2 M$ Tpython+matplotlib绘制南丁格尔玫瑰图
    # Y; B1 J! Q, [实验:绘制南丁格尔玫瑰图
    $ R$ A& k9 d2 w  本实验有一定难度,有人说matplotlib绘图和matlab大同小异,我看除了一些函数名相同之外,其他的像参数和使用方法很不一样.另外我不知道是不是在matlab中画玫瑰图直接一个"肉丝"函数就成了,为什么matplotlib里面没有~~
    . f* U9 a& S. h% i% ~" f9 z3 k* T- j  无论如何还是感谢本次实验,虽然费了点时间但是我对函数画图有了一定深度的了解和掌握,草草在python之matplotlib库重要绘图函数简介里面记录了一下,因为内容太多没有一一写成博文,但是附加了一些别人博客的链接,还是很有帮助的.
    ' t9 ~: u3 w8 a* `3 l& x( L: d+ H& M! I
    文章目录
    # {5 L! f0 U; F
    4 b* j" P  ^0 ?$ z一、实验目的
    1 M: S5 W8 `* j0 D6 O/ ?8 [0 D, W二、实验内容+ K5 @0 ~: n  P2 m0 P, m
    三、实验环境+ V2 T" ^% u3 y7 e% y  j
    四、实验步骤
    : N8 x" O* W# A* T3 ~) U五、实验代码及测试, }+ {0 f' R) k) G
    1.源代码& n! F, M% U9 X) x9 X& d
    2.运行结果! k* c6 `' ~4 h& Y/ {. b( }
    3.excel数据表. F- j1 g4 y" q  B& U; y, o
    一、实验目的
    . T+ ]- K) |( C, L) C# R8 J" J2 s0 [. e+ D7 V; I
      了解玫瑰图的前世今生;了解matplotlib标准库中的pyplot模块;了解在极坐标系中绘制柱状图。' W' N, z& X, E" Q8 G: l. _) x

    3 T; Y2 K& f) D* E( x- |) q二、实验内容1 Y' S. Y. c5 \/ \% [3 I* l. a$ I

    3 |$ L) f6 T$ _( ]  南丁格尔玫瑰图(Nightingale rose diagram)又名鸡冠花图(Coxcomb Chart)或极坐标区域图(Polar area diagram)。它将柱图转化为更美观饼图形式,是极坐标化的柱图。不同于饼图用角度表现数值或占比,南丁格尔玫瑰图使用扇形的半径表示数据的大小,各扇形的角度则保持一致。5 n  o3 S; a5 ?$ m5 f1 ?
      自行选择一组数据,画出基础玫瑰图。
    ' V) w6 B* A* [
    / m% K! D4 B) e9 N5 x1 z三、实验环境" ^% `6 Y; Z6 j& r

      E2 ]8 m" ?' Y9 S; k; c1 j  ython 3.8
    " s  E3 Q1 Q6 f- `6 b
    0 u9 i/ @) G& q四、实验步骤  P- D0 {8 @! y3 }5 B
    ; h/ Z- ^3 n% d1 f- _& w
    查阅文档,了解南丁格尔玫瑰图的原理。8 r. C  `' @2 ?* R! p4 N
    选择一组数据,编写程序画出玫瑰图。
    & I0 a/ J3 e  k7 f8 ^五、实验代码及测试
    # t$ p3 z+ U; \% n
    0 C( E0 `" _) M& X1.源代码/ c' N$ ~7 s: h$ \( }! g+ w
    & o# @# u2 ?- i0 i4 E! @6 F8 @
    import matplotlib.pyplot as plt6 M: x% h7 Z; p* @0 R1 x
    import numpy as np
    : A: ]( G$ J/ Q+ R6 Y( ^3 Z7 q- ]- himport xlrd) D" I0 h- N3 I. M
    % v: x; @! g+ Z% g! g8 G8 M
    '''; V4 ~9 H& R/ Q' M
        按列读取excel文件并存入两个列表
    4 n- P+ v0 f6 b+ l* {'''
    4 r. _1 w/ I- K# F2 wdata=xlrd.open_workbook(r'亚洲国家疫情数据.xlsx') & X7 A# w$ F5 C& X
    table  = data.sheets()[0]   #通过索引顺序获取工作表* s( @( M% y* x: Y8 I
    cols_n = table.ncols
    . a1 Q; B7 Q$ F& A! O6 e( `5 N  p2 O+ vcountry_list = table.col_values(0,start_rowx=1) # start_rowx默认为0,设置为1去掉列名
    7 \2 i% P/ |1 T' H  Adata_list = table.col_values(1,start_rowx=1)
    , d+ y& e' F" c' c! g0 [8 h# print(data_list)$ o/ e7 b" X/ A9 U. T" C

    ( _+ a/ c1 _( U6 a3 @! z' h'''' j& H2 c, I3 d, ^; ^5 P
        计算角度' q2 \" i: e! a4 C! ^) s6 i
    '''
    2 _! T3 e, x" a6 X/ {) z: @n = table.nrows-1           #去掉列名6 s4 ?1 {0 \4 p! g; l
    theta = np.linspace(0,2*np.pi,len(data_list))    # 360度等分成n份. w; T% ^1 z9 |
    6 |/ b5 `3 f2 w' v
    '''9 v& o9 P* Y2 T5 B
        作图
    / I: L9 e$ {) V5 C''') I( q& `- s* `: z
    # 设置画布
    & |; J8 Y5 T& i  W+ c( z4 A3 pfig = plt.figure(figsize=(12,10))3 S$ R2 L; \/ U, D; ]  O5 i) ?. r
    # 极坐标
    & M9 c+ Q8 f5 O% X! Lax = plt.subplot(111,projection = 'polar')
    - g' _8 Q7 m; C. T: j# 顺时针并设置N方向为0度
    . I( k: J$ v) Z" u  n# h$ _1 d+ Iax.set_theta_direction(-1)
    0 t0 l/ f: M" I  B( `! x/ \ax.set_theta_zero_location('N')
    6 E2 A1 ]: W( S! ^. C/ Z
    3 s$ |4 M: V3 @6 c# 在极坐标中画柱形图
    + a5 ~2 U3 H/ ^ax.bar(theta,
    ' i; R7 f( j* x6 ]( `& B: n; r4 a        data_list,! x) T% d+ K1 s, L: N9 H1 e2 E
            width = 0.33,
    5 V  ?7 f. |$ J9 x; o; P1 l1 j- j        color = np.random.random((len(data_list),3)),4 R2 N; p, z7 f  f
            # labels=str(country_list),
    + P3 d& d3 \! D' ?        align = 'edge')  o6 h2 m8 l1 g" Y8 R
    '''   }2 j/ W6 }; c( n! ]
        显示一些简单的中文图例
    6 m/ T% K( s! N'''
    ! F+ z. _( c. O4 f0 iplt.rcParams['font.sans-serif']=['SimHei']  # 黑体
    # o+ B1 {  e1 Q! Gax.set_title('亚洲国家现存确诊',fontdict={'fontsize':20})
    2 n: o, Q; ?) Sfor angle,data in zip(theta,data_list):6 ]: I! u  Z( A3 _
        ax.text(angle+0.03,data+100,str(data))
    ) J8 [1 `$ R% M! C) G/ \' F3 S' L" p$ D: |# ]
    $ J+ ?) P! O& C9 _9 r
    plt.axis('off')
    $ I1 x9 X2 F% Z3 r0 g* w+ [' V/ `! p4 H0 c1 v
    plt.savefig('Nightingale_rose.png')$ a0 h, k% c' {+ ^7 ]7 O1 n
    plt.show()3 [+ d1 \9 w! ^) h+ A  Q( N' P3 r
    ; _! [  p  _3 E6 @6 U5 U4 W2 @) @
    ( k( ?( |, P9 `
    2.运行结果9 x# @: U1 W7 p6 R; h
    1.png
    / d5 `0 [0 f" S6 p5 x" \, r5 |. L  T2 h, C: }2 ~9 @5 F" K0 ?( u9 }/ D
    & D- E' o) J$ F, f
    3.excel数据表2 n/ p3 i; A- n& @
    2.png
    8 t( ^+ c( X; l% i$ }4 @% k5 e) a
    4.说明
    & P4 Z$ P! I# A7 q  四位数过长,而对应的图所占比例很小,所以在图上的标注有些重叠.( u1 Y" I' \' J; t, S
      实验让画出基础玫瑰图,并没有图例和标签的要求,而且给玫瑰图设置标签的步骤比较繁琐,所以没有涉及到.5 R, f- o" y2 @4 ~
    ————————————————0 y- y. g5 k( b8 F
    版权声明:本文为CSDN博主「小兰同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    & S3 A1 a  s2 ^5 w, y; ~原文链接:https://blog.csdn.net/weixin_42323041/article/details/1062638523 K9 e# k/ f7 u" V

    / Y0 ^6 H3 j# e- H+ M( e% N  i& ~, R
    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-19 00:27 , Processed in 0.439587 second(s), 54 queries .

    回顶部