QQ登录

只需要一步,快速开始

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

    * o- T8 O' k- w' j% g3 [python+matplotlib绘制南丁格尔玫瑰图7 k1 ~7 h% a  W8 g" |0 d6 k) e
    实验:绘制南丁格尔玫瑰图
    ; w& E8 |" O. k8 p' g  本实验有一定难度,有人说matplotlib绘图和matlab大同小异,我看除了一些函数名相同之外,其他的像参数和使用方法很不一样.另外我不知道是不是在matlab中画玫瑰图直接一个"肉丝"函数就成了,为什么matplotlib里面没有~~* ]$ h5 l2 e+ {, R
      无论如何还是感谢本次实验,虽然费了点时间但是我对函数画图有了一定深度的了解和掌握,草草在python之matplotlib库重要绘图函数简介里面记录了一下,因为内容太多没有一一写成博文,但是附加了一些别人博客的链接,还是很有帮助的.: J" ]" F9 x. e7 h$ r0 C
      @& g$ h( a+ }/ O" E8 w, w
    文章目录" |- L9 K* k# @, o$ k- V& \2 K

    3 n) Q' K9 g# j& |& M3 l一、实验目的
    1 U3 E) o% v3 ^; C二、实验内容  n2 w/ `( e- [' y2 Q. _
    三、实验环境
    , E" S# G, F$ l$ _: \: }四、实验步骤: t  ?4 Z' g, |" L
    五、实验代码及测试
    7 M6 W. Q# N. x7 f) M+ D1.源代码
    1 N: M' M& D7 l% b2.运行结果
    6 n* h! G4 l* i8 g7 i. Y9 H9 b2 T3.excel数据表
    / {! A* z& z. B- A" _, E一、实验目的1 V& ^, Y* l. @6 D
    8 e: U0 m& K3 e  x! n
      了解玫瑰图的前世今生;了解matplotlib标准库中的pyplot模块;了解在极坐标系中绘制柱状图。
    9 E6 @! A0 i" Y) G1 f4 [/ E1 `8 P- J8 c2 ]' M1 X) d
    二、实验内容
    : G. E$ u/ I$ G  H6 M
    1 E/ @3 b, p  H7 W. K  P; p% G  南丁格尔玫瑰图(Nightingale rose diagram)又名鸡冠花图(Coxcomb Chart)或极坐标区域图(Polar area diagram)。它将柱图转化为更美观饼图形式,是极坐标化的柱图。不同于饼图用角度表现数值或占比,南丁格尔玫瑰图使用扇形的半径表示数据的大小,各扇形的角度则保持一致。
    8 X9 [' n: y( a7 }  自行选择一组数据,画出基础玫瑰图。4 p" x+ \0 p% S( B5 V

    , ?( ^0 {+ h0 B三、实验环境
      H0 h9 ]$ V* m) m+ @  Y3 x3 Q) d. h; D
      ython 3.8
    % A* v5 D8 w$ X1 D% a0 m* R) @+ p# B3 W; A: X3 |& A
    四、实验步骤5 \; X; r- J: X. ^6 c# m
    / o( P* v$ [  D5 ^! _% X! y5 a
    查阅文档,了解南丁格尔玫瑰图的原理。3 J9 W- N2 t5 U- X* y$ V* f+ \# u
    选择一组数据,编写程序画出玫瑰图。
    ( A5 O* D7 W$ F' H4 J% j五、实验代码及测试6 F5 U' j% Q& G7 s' {/ a; A) a5 a

      X' f2 p9 u5 q( |* I/ j1.源代码6 `2 ~7 A+ O2 p: `8 z5 D  D
    $ {7 B2 c8 E( H% x
    import matplotlib.pyplot as plt
    ) |/ y. G) p" d2 E7 nimport numpy as np
    ( P4 ~) u7 K3 z3 \& i% A0 pimport xlrd
    ! p+ {/ W1 G% O7 b. p" m, y: V
    5 N6 H; L) D; X) A& }/ ~8 c' Y6 u'''
    0 I0 j0 f3 M/ o" t, _: V: q    按列读取excel文件并存入两个列表
    + A4 `8 t- N7 n1 }. p9 u+ w" P9 h'''
    * @$ w8 e7 e3 N* j( Bdata=xlrd.open_workbook(r'亚洲国家疫情数据.xlsx') 8 k0 K+ x' q: C- K" e0 S; B) J
    table  = data.sheets()[0]   #通过索引顺序获取工作表7 E. a2 |8 K3 ~! _. o& F6 E
    cols_n = table.ncols 8 u; l5 I* m: I! p! j& y
    country_list = table.col_values(0,start_rowx=1) # start_rowx默认为0,设置为1去掉列名, n- Y5 M+ _% Y7 {, s0 `& L( b' F% o
    data_list = table.col_values(1,start_rowx=1)
    & ]* w) q* d" [6 D: N# print(data_list)
    ; I" H- \: G3 H* Q3 X% P( l- y8 V& V, o8 {
    '''( ^! y+ k; f) X6 s1 J: ]
        计算角度
    / }- @8 o( O- ]4 H  X'''4 `* A5 w9 o: F) t
    n = table.nrows-1           #去掉列名2 l$ t- M! r% \$ a3 i- I
    theta = np.linspace(0,2*np.pi,len(data_list))    # 360度等分成n份
    5 H$ t" [; `' z% G
    , m( A2 A$ u% M, ?6 s'''
    # U; J) C# \! h0 z$ H( o5 H    作图8 @% M; o, G5 N
    '''
    1 G( Q8 V2 X8 j1 ?9 \. G+ A# 设置画布, Q( g+ T: {) d' ?+ Q
    fig = plt.figure(figsize=(12,10))( H) a- s% i; I% _  `5 g
    # 极坐标
    " I0 }7 j' A5 [( r1 `( U' V5 dax = plt.subplot(111,projection = 'polar')
    " x( ]/ N: g; X5 G# Y  i# 顺时针并设置N方向为0度% z! S+ U. Y  {$ k. Z- S
    ax.set_theta_direction(-1)
    . w" D0 n) ?; M; m: c5 b% _7 Yax.set_theta_zero_location('N') . l) j+ E: G% o) l3 i1 G* V
    9 O( y; e, x. j' j
    # 在极坐标中画柱形图* e) b' p: D. h
    ax.bar(theta,2 B, f1 H0 C3 M, Y
            data_list,
    1 U/ W& R" [! ]& k        width = 0.33,3 \5 s9 ^  w. K  e. x) _
            color = np.random.random((len(data_list),3)),( p& p8 g& r0 l; N  i5 M
            # labels=str(country_list), ' }) `" x" {* m5 C, q! [! o2 o1 p0 H* h
            align = 'edge'), [. S% _: y5 Z
    ''' 8 _' {5 D& _# x2 G& M. a) v
        显示一些简单的中文图例
    8 c8 j3 z/ Q0 V$ u1 h; Z# j1 {  K# |''': G7 h0 L) x9 R
    plt.rcParams['font.sans-serif']=['SimHei']  # 黑体  w$ y, g1 y7 x/ I" w$ O1 k
    ax.set_title('亚洲国家现存确诊',fontdict={'fontsize':20})* ?1 z( D: W0 j+ y
    for angle,data in zip(theta,data_list):" J4 |) n& u" E
        ax.text(angle+0.03,data+100,str(data))
    9 T( j! R: k. |% Y
    + G  h5 s* K: _1 t) g& u( t% ?) @5 l+ F. g
    plt.axis('off'). l/ S, m# M- ]; e# b
    9 S% w( H( i+ P, g4 m
    plt.savefig('Nightingale_rose.png')( I6 I# d8 i8 Y  s% M
    plt.show()
    ( H' X' {- J. s/ }) u* p5 K( y+ z

    7 s4 ?8 f* |0 |8 r- `; f2.运行结果7 f: o0 z/ Z0 ~9 Q  M( Y# r
    1.png
    0 v, n9 c/ N# {) Z
    " [6 X; M1 \: G4 P( w! I# q. Z6 x- D+ |, R. _. q
    3.excel数据表! y& [) ~0 k1 i( l' j6 s8 H
    2.png ( d, g0 H3 K2 |

    8 c$ K+ |0 I2 o1 l4.说明
    & @& H) s1 }8 j: u4 T  四位数过长,而对应的图所占比例很小,所以在图上的标注有些重叠.
    2 D2 {& o: h0 H4 S/ Q. R  实验让画出基础玫瑰图,并没有图例和标签的要求,而且给玫瑰图设置标签的步骤比较繁琐,所以没有涉及到.# I# y0 q' g% }
    ————————————————) I; X) ?) Z3 y/ p# ^7 v8 }
    版权声明:本文为CSDN博主「小兰同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。' q5 g+ d, d& R  ^$ A
    原文链接:https://blog.csdn.net/weixin_42323041/article/details/106263852
    1 ?" ^' N" |+ i( U0 n! F6 O- S- o4 M/ C- k6 C

    $ D' L$ r8 k) C  b  J' n5 k
    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, 2025-8-24 09:29 , Processed in 0.657798 second(s), 53 queries .

    回顶部