QQ登录

只需要一步,快速开始

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

    7 v1 A) A0 {$ X. h2 S, H  j, lpython+matplotlib绘制南丁格尔玫瑰图
    . [0 @* z4 x( m& H$ ]% u实验:绘制南丁格尔玫瑰图) e: A7 m: F7 U' G3 L; j- K- D
      本实验有一定难度,有人说matplotlib绘图和matlab大同小异,我看除了一些函数名相同之外,其他的像参数和使用方法很不一样.另外我不知道是不是在matlab中画玫瑰图直接一个"肉丝"函数就成了,为什么matplotlib里面没有~~
    * M2 r* t2 C5 d  U  无论如何还是感谢本次实验,虽然费了点时间但是我对函数画图有了一定深度的了解和掌握,草草在python之matplotlib库重要绘图函数简介里面记录了一下,因为内容太多没有一一写成博文,但是附加了一些别人博客的链接,还是很有帮助的.' P3 n& x% S! k* Z/ G4 \# X$ z% q
    ; l: d, f; X" i0 f- A) c
    文章目录+ L2 u: I0 \" m" F
    1 I: y1 K" B" Q2 M+ W
    一、实验目的
    , v; S0 H8 d0 c6 a) M二、实验内容
    % |+ A  d* _. L' B+ ^三、实验环境
      e" _/ l( n) p7 e四、实验步骤
    1 \8 F4 ^8 B! i3 k/ d五、实验代码及测试* C) J4 b* x% z6 y/ Z
    1.源代码
    2 I! x' K2 q/ l" D/ `: r2.运行结果
    5 u4 x9 F6 `& ]! |( \: W4 K3.excel数据表
    ! c2 i( o$ Y2 j- K6 T+ @4 R一、实验目的
    " s2 ?  d" U( I# D9 @1 q/ v  ?$ ~+ k
      了解玫瑰图的前世今生;了解matplotlib标准库中的pyplot模块;了解在极坐标系中绘制柱状图。" i: z0 y! b( P  Z0 d) b. v( p$ P

    1 ?1 s5 @+ P, e: r二、实验内容+ J  \: R; S4 @+ y0 L  Q
    6 b/ T. S3 t8 J; I
      南丁格尔玫瑰图(Nightingale rose diagram)又名鸡冠花图(Coxcomb Chart)或极坐标区域图(Polar area diagram)。它将柱图转化为更美观饼图形式,是极坐标化的柱图。不同于饼图用角度表现数值或占比,南丁格尔玫瑰图使用扇形的半径表示数据的大小,各扇形的角度则保持一致。
    ; r6 y+ h* C* W3 ~  自行选择一组数据,画出基础玫瑰图。# B$ i2 }" K9 P9 p. m7 E
    2 B  d% _/ s7 S" x. b2 R% g
    三、实验环境/ V; p: T0 D( p, T/ s$ D
    8 G+ \; y& z1 `
      ython 3.87 X7 q# F& y& i- Y& \0 I0 u, \$ [
    : y' w/ }  W( ~/ k
    四、实验步骤$ M# d+ R3 {& ?9 @6 {0 J
    " g) p; I0 t; y6 r
    查阅文档,了解南丁格尔玫瑰图的原理。9 E1 r0 X, s2 H9 |& ~; s
    选择一组数据,编写程序画出玫瑰图。
    : P7 X2 \, V# Y+ @6 q9 U7 H: W五、实验代码及测试6 c1 ^6 y* f8 P6 x1 i# W2 Q2 r$ I
    2 J/ Z) u- T: q+ G
    1.源代码) T# o7 V" A" x& H( B! z$ H" t; i

    0 }" ~; s; V, `1 A* }7 |* E( F( [import matplotlib.pyplot as plt
    4 Z2 ^9 |( h0 J9 V# p# m4 A$ C7 }  qimport numpy as np6 t9 V0 l7 i+ }" [+ c5 ^4 o
    import xlrd4 b% R# H' o6 Z; F7 V& }

    " Q3 u; E8 q, t; o9 x4 ]'''
    + j8 S. ]% {- q1 r: h# E, o    按列读取excel文件并存入两个列表4 ^) `! C. C0 h) K& [9 g: x
    '''4 j" u4 x/ A( m* k2 V9 c
    data=xlrd.open_workbook(r'亚洲国家疫情数据.xlsx')
    # Z& j/ S  i3 R5 e! ctable  = data.sheets()[0]   #通过索引顺序获取工作表3 J2 d7 Y$ D4 ^/ ]% G9 X, x6 Y
    cols_n = table.ncols   g# r" L, k9 g; L9 p
    country_list = table.col_values(0,start_rowx=1) # start_rowx默认为0,设置为1去掉列名$ f# Z$ ~9 [0 b3 Z* I
    data_list = table.col_values(1,start_rowx=1)! W$ ?5 H8 E6 x, Y. E- L
    # print(data_list)2 {+ _  C" E3 E6 m+ f

    4 c& ?7 B3 L1 e2 }) i& i'''+ k; ^/ a1 o& |! M! `
        计算角度
    $ E# c) Y! L! B0 `+ ^# K'''
    ; U8 k: i; d2 \, a: qn = table.nrows-1           #去掉列名; U7 s. C) l+ R1 w7 \: j& \) f
    theta = np.linspace(0,2*np.pi,len(data_list))    # 360度等分成n份( N& }9 X# ^: i, Q9 s) s. z9 p7 I
    ! ?6 l) P6 K$ e% S) v0 t5 K' [  {1 W
    '''
    ( l* S, Y* r# m8 E! ~    作图* Y. f* u* n- w7 D: q2 [
    '''
    & M6 K& V& j% m# 设置画布. }9 P+ n( z9 \# F
    fig = plt.figure(figsize=(12,10))
    $ w. B& ~+ }. L1 m3 t* V* E: l# 极坐标. g0 x0 |/ k; E, V5 J! y
    ax = plt.subplot(111,projection = 'polar')$ }, L# A! }* C, N1 B
    # 顺时针并设置N方向为0度1 L5 v  ]! V7 l1 A* h# Y* b) R
    ax.set_theta_direction(-1), I+ Z7 b- h  ?' l; z8 @, Z! b
    ax.set_theta_zero_location('N') 6 p8 R9 ?( K; [  F/ S( a
    . T2 ?7 k0 {! q0 b
    # 在极坐标中画柱形图
      p5 h8 m7 g8 @. n5 c8 d/ ?7 _ax.bar(theta,4 R4 v3 M. @1 k3 g* n2 {
            data_list,
    ! g1 o6 V& W( x- F        width = 0.33,6 r1 A- u1 O  i
            color = np.random.random((len(data_list),3)),
    $ j7 F6 E) q- I6 y        # labels=str(country_list), 9 k( R8 r' Y" B2 e, ?
            align = 'edge')
    6 P5 R: W0 s  K4 d+ B' Q'''
    1 M7 C8 L$ b5 N) Q) e; _5 v    显示一些简单的中文图例
    ( s: q2 I! p4 S2 Z) Q4 `'''6 v7 `: l/ F. _. @, U% T+ [
    plt.rcParams['font.sans-serif']=['SimHei']  # 黑体1 |/ B6 D+ [+ J: ?
    ax.set_title('亚洲国家现存确诊',fontdict={'fontsize':20})
    + E5 c" z/ }! H% a( ^" gfor angle,data in zip(theta,data_list):
    ' j9 E# M  @5 Z# x, _( R% I    ax.text(angle+0.03,data+100,str(data)) 9 u- z) M' [( }5 E! c
    ' T0 u/ m8 J8 G  w+ F6 n5 ~
    ! x. n' S- W$ r/ Q' U: O* |* X
    plt.axis('off')4 r- q3 T( \: L3 C, ^
    : d0 P( V& J9 l) E4 y' v* X
    plt.savefig('Nightingale_rose.png')
    - W9 C' s( m2 j- s3 Xplt.show()  n" u+ d$ o$ n6 Z% D, j
    : u( D+ E- ^% a) N; ^( ~4 b

    " a+ L* P/ q" y9 y/ `- P2.运行结果
    % L0 S. _1 X0 j6 d. U$ Z 1.png
    + V2 `# l( m& Z5 n* s# F2 n1 O0 F1 o* v% s
      U0 l/ a5 J, d3 _. k
    3.excel数据表
    * T6 t5 w; U) B0 I 2.png % t6 S) }: H& n) p

    $ K' V" Q; A8 \4.说明0 }( D2 r, b8 S5 q( G
      四位数过长,而对应的图所占比例很小,所以在图上的标注有些重叠.
    " X) f, L+ T3 d/ \- e/ `  实验让画出基础玫瑰图,并没有图例和标签的要求,而且给玫瑰图设置标签的步骤比较繁琐,所以没有涉及到." e' U2 P; z8 O% e7 o9 j
    ————————————————
    3 k- m5 [! x8 E6 X版权声明:本文为CSDN博主「小兰同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    # r% w, a5 X6 H3 |2 K" {' I' z原文链接:https://blog.csdn.net/weixin_42323041/article/details/106263852
    3 t. L% y4 u0 L# b9 o, f& ]" L: W/ w  s3 _2 T  ~
    * N' W' I8 ~' X; |% m0 h. _) M  u/ y
    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-18 06:48 , Processed in 0.339013 second(s), 54 queries .

    回顶部