QQ登录

只需要一步,快速开始

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

    . y# @4 V1 r5 Hpython+matplotlib绘制南丁格尔玫瑰图
    ! f& [6 S# s4 R" h( a1 E( V& X4 Z实验:绘制南丁格尔玫瑰图% e$ u5 g' E, P7 c
      本实验有一定难度,有人说matplotlib绘图和matlab大同小异,我看除了一些函数名相同之外,其他的像参数和使用方法很不一样.另外我不知道是不是在matlab中画玫瑰图直接一个"肉丝"函数就成了,为什么matplotlib里面没有~~/ m6 l: t# {! {* ^. B
      无论如何还是感谢本次实验,虽然费了点时间但是我对函数画图有了一定深度的了解和掌握,草草在python之matplotlib库重要绘图函数简介里面记录了一下,因为内容太多没有一一写成博文,但是附加了一些别人博客的链接,还是很有帮助的.% D0 @: o& F% H, I5 i: m
    0 [+ M# J$ `2 X1 ~- H
    文章目录8 i1 m8 ?' u' g" L6 D; q' i
    ; c: M, b7 \9 K( b2 O% w
    一、实验目的3 r; R& K( M8 t# p/ @
    二、实验内容
    $ Y, H( `% u! N: F- L/ e. v0 C) K3 O三、实验环境: G- o" P+ ~* \: d" t: m
    四、实验步骤
    ; [3 `- i. L- M9 e五、实验代码及测试
    5 v- u% _/ q! V1.源代码
    3 s0 x; p0 f5 ]: e0 t9 d( n2.运行结果2 @) R% j/ ~8 N
    3.excel数据表* C: v! v! I& \$ {3 ?* |
    一、实验目的5 R+ s6 u) x' Z8 W, H
    2 z8 x- m& c6 c- I9 E8 y" ?! s
      了解玫瑰图的前世今生;了解matplotlib标准库中的pyplot模块;了解在极坐标系中绘制柱状图。$ A0 H: l- ?( U9 g
    6 H! ]; }+ p' E& O
    二、实验内容* R& h( u* i# S: l
    , g# Q6 o7 |8 C% u1 O
      南丁格尔玫瑰图(Nightingale rose diagram)又名鸡冠花图(Coxcomb Chart)或极坐标区域图(Polar area diagram)。它将柱图转化为更美观饼图形式,是极坐标化的柱图。不同于饼图用角度表现数值或占比,南丁格尔玫瑰图使用扇形的半径表示数据的大小,各扇形的角度则保持一致。2 w  L: ~* z6 V4 n5 H: z
      自行选择一组数据,画出基础玫瑰图。
    # {1 @; n  q! [% z) w8 x+ p. p; U0 c, z+ ^0 u6 E8 V/ [
    三、实验环境" E4 B* Q  U. |
    $ ]1 R8 e6 d6 {4 o, F
      ython 3.8
    4 g# G: z# \/ i8 y* `
    - J$ s" C/ g" O$ F" X4 b四、实验步骤* n/ T8 O; w! d( d) q, x  W
    ; R7 c* a% I2 T" U& q& {9 j" U
    查阅文档,了解南丁格尔玫瑰图的原理。
    / g! N4 k0 e* r# A% s选择一组数据,编写程序画出玫瑰图。
    + n$ R2 h$ V: a. |+ \五、实验代码及测试4 i1 Z5 M3 w" F% ~. x

    1 p0 v4 U! v, _& Y1.源代码& _8 F( F' u% E

    ) a# x' J- Y, A3 h, W5 t; [import matplotlib.pyplot as plt
    0 O5 g; S7 s# y$ L0 L6 G& uimport numpy as np
    1 J. t$ ]. F% Himport xlrd9 u# G1 Y+ ^7 M  t, ]
    6 c6 G4 C7 ^' S* S4 T. A+ W4 o2 v
    '''
    3 e! X) {: }0 i$ }2 t# K    按列读取excel文件并存入两个列表
    + U, E* a5 M: e7 _* t'''3 B8 {4 h  {1 v- F4 w
    data=xlrd.open_workbook(r'亚洲国家疫情数据.xlsx') 0 o4 K# [" k, Y* `* s/ _6 ?
    table  = data.sheets()[0]   #通过索引顺序获取工作表4 P: _$ A* T: C- I
    cols_n = table.ncols
    ) q& w1 Y. q- F2 A) p# [. u: A0 qcountry_list = table.col_values(0,start_rowx=1) # start_rowx默认为0,设置为1去掉列名- e) L6 Y7 [' r1 G; _; @
    data_list = table.col_values(1,start_rowx=1)' i, k! y" o+ U. O2 M
    # print(data_list)
    7 B0 w7 }& q& c" @2 a1 @/ Y. f6 `7 Y" g3 b8 U; G( I5 k: I! P
    '''
      U" `6 F7 k# O8 y% a    计算角度, Z; _6 ~+ B1 G( f' `  F/ T# s
    '''
    % g$ m5 e& `- N! v% Nn = table.nrows-1           #去掉列名# T3 P/ w6 K1 E1 V! d  {' N$ V, m" \
    theta = np.linspace(0,2*np.pi,len(data_list))    # 360度等分成n份9 m: F. F7 \$ }
    1 D8 k3 w+ y2 w6 ]7 I
    '''/ x: @% R' o6 G0 R
        作图* s' T5 w4 X0 i( ]9 Y5 m: F
    '''
    " z7 u8 P3 d/ P, D2 r: X# 设置画布
    , O7 f9 K: L( ]" Efig = plt.figure(figsize=(12,10))# \! s1 f6 A- O
    # 极坐标
    7 j0 d2 d. l+ iax = plt.subplot(111,projection = 'polar')
    ) [, g& D9 G$ K: [8 a: S) j" [# 顺时针并设置N方向为0度3 P, S  o4 n0 S4 O9 }1 V7 K+ ]
    ax.set_theta_direction(-1)
    ' y/ }" F/ ^0 S0 Xax.set_theta_zero_location('N')
    ; p' w$ \6 ]* `( L* {' f$ i( ]
    2 i( R" Y' n% {/ k2 S& n- g; X2 `* i# 在极坐标中画柱形图: ]! X1 o6 {, |6 G0 d6 f: w
    ax.bar(theta,/ t, n) d% r- ?9 b7 R. `( a; [
            data_list,
    " ]; ]6 z8 A; D- A        width = 0.33,
    % |# A$ R! j0 d$ d' ?: c        color = np.random.random((len(data_list),3))," R' V: z* g/ S& U9 ~
            # labels=str(country_list),
    5 p0 y% F! Q9 x6 W/ v9 a* w        align = 'edge')
    ( |- X5 T  p. L) f- }/ a" p# M6 \'''
    9 B4 X* X! ?4 A: V. t' ^$ {+ K    显示一些简单的中文图例* K$ \9 {; W2 a( O9 Z7 _
    '''' b- `9 A8 {5 k5 b3 ~4 `7 O0 j
    plt.rcParams['font.sans-serif']=['SimHei']  # 黑体
      M- o! M$ W6 E5 Jax.set_title('亚洲国家现存确诊',fontdict={'fontsize':20})
    1 {8 |6 }/ h7 Nfor angle,data in zip(theta,data_list):
    ) Y2 b* U1 i" r+ @7 e- ?" F    ax.text(angle+0.03,data+100,str(data)) 3 h& j) k4 l* h6 J
    ; P+ c; i# y# m3 X- [3 {6 T

    . p/ m5 m6 m( I: q: c9 U7 _- _plt.axis('off'), W/ n  Q( P. e6 e( u$ p

    & @5 ]" q0 ?9 |1 fplt.savefig('Nightingale_rose.png')( u% a) T3 o3 i  R# c# p
    plt.show()
      M, L2 W+ v& a7 x7 B0 l# k' P! ]* |; ]7 x  T( ?4 w

    5 [! [0 x: H& N, o$ A2.运行结果
    5 S+ P. l/ Y' u- a8 g8 C: n* h1 n 1.png
    ) g+ @. a+ e) X: P7 S
    , G% \/ B# ~! r1 p$ z, j+ _
    - f4 {4 L3 z$ k: b3 C3.excel数据表; o, X, ^. H+ W1 A' R3 f8 G
    2.png 8 b& h6 m3 J7 e
    ' W: J$ }, f4 Y* ~( o
    4.说明
    $ S0 Z1 Q+ t! h* w6 c9 A5 H  i' y  四位数过长,而对应的图所占比例很小,所以在图上的标注有些重叠.5 `, Y8 @" d0 Q2 G  F5 n
      实验让画出基础玫瑰图,并没有图例和标签的要求,而且给玫瑰图设置标签的步骤比较繁琐,所以没有涉及到.* m, z. |4 y9 D( l
    ————————————————9 ^: Z7 P' k+ x2 G. N4 f
    版权声明:本文为CSDN博主「小兰同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 y& C1 q1 m. Z/ M  k- J
    原文链接:https://blog.csdn.net/weixin_42323041/article/details/1062638524 ?  E1 J- i2 l8 V* N
    5 ^4 S" [  t: H
      d, n1 w6 d) Y4 E/ B0 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, 2026-7-18 12:05 , Processed in 0.349787 second(s), 54 queries .

    回顶部