QQ登录

只需要一步,快速开始

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

    ! k2 |8 I, p5 J) L8 a) `0 ypython+matplotlib绘制南丁格尔玫瑰图
    + }: @, X' @% t' W. h8 v8 h实验:绘制南丁格尔玫瑰图3 {# Z- }! F- K7 {
      本实验有一定难度,有人说matplotlib绘图和matlab大同小异,我看除了一些函数名相同之外,其他的像参数和使用方法很不一样.另外我不知道是不是在matlab中画玫瑰图直接一个"肉丝"函数就成了,为什么matplotlib里面没有~~
    3 I  x1 t, [& K# @; M7 t  无论如何还是感谢本次实验,虽然费了点时间但是我对函数画图有了一定深度的了解和掌握,草草在python之matplotlib库重要绘图函数简介里面记录了一下,因为内容太多没有一一写成博文,但是附加了一些别人博客的链接,还是很有帮助的.2 ^0 R1 ^3 k, a: {; b3 b6 T! u: Q
    # F) ]8 \0 S% |4 B1 v; j3 s+ l2 R: Y, z
    文章目录
    1 X! R* U' N, W' Q6 t1 R( a* u( o, O) t9 O7 r
    一、实验目的
    2 z8 ^; V' \4 D% `  f6 M: y二、实验内容
    7 R" h' f6 D- [% J" o& O% y. g三、实验环境  x2 ~4 J8 N, I4 V# q1 ~( n6 y/ J
    四、实验步骤1 q. I9 J4 W" p. l. d
    五、实验代码及测试" N, a' a: o3 j1 f
    1.源代码1 E- Y3 o! _! F8 N
    2.运行结果
    ! a' j/ Y$ J" `8 Y0 C" Z3.excel数据表
    7 K# m6 \: M  n2 I9 r一、实验目的2 A$ u! m- T8 P" p
    2 D+ ^4 @$ K( B( g( j& ?8 u9 |' o
      了解玫瑰图的前世今生;了解matplotlib标准库中的pyplot模块;了解在极坐标系中绘制柱状图。
    7 Z6 t/ I7 t1 C5 K1 ~- g- @: O6 v
      `' V( b1 O" y% `二、实验内容8 z% D4 M8 |' j! m. Z& k

    # L8 `1 t4 E. k/ J  南丁格尔玫瑰图(Nightingale rose diagram)又名鸡冠花图(Coxcomb Chart)或极坐标区域图(Polar area diagram)。它将柱图转化为更美观饼图形式,是极坐标化的柱图。不同于饼图用角度表现数值或占比,南丁格尔玫瑰图使用扇形的半径表示数据的大小,各扇形的角度则保持一致。) [3 }. E) ^* L# o
      自行选择一组数据,画出基础玫瑰图。
    # Z( ~4 @% {$ a1 E' O6 e: I: u+ j1 j& d' A/ |
    三、实验环境
    ) A" |/ i% ~% F3 n  @+ G9 |* \+ C
      ython 3.81 j- D8 r' c) S. \7 g8 F

    % P9 ]+ z3 o. f9 r四、实验步骤
    ; u" V$ d$ u1 X. Q7 E* Q' G
    7 D! z/ Y$ d7 E. x查阅文档,了解南丁格尔玫瑰图的原理。
    & b% ^8 ?6 V, t/ _# r+ V选择一组数据,编写程序画出玫瑰图。* y4 d' w( R# A
    五、实验代码及测试
    + x% t3 {3 A! J2 C' ^# ^( f* Y: q# V0 [8 Q
    1.源代码
    1 k# X6 x! ~' k5 D! }4 k/ D; ?
    import matplotlib.pyplot as plt
    4 w( |* q) c" zimport numpy as np8 y! I  M  C% ]; M8 w1 ^
    import xlrd- e# a+ W1 R9 L0 y5 m: @

    , \& z* u4 X. ]& w, ^# `'''. b7 O  d! K) t% T9 j* V- K* M, L1 l
        按列读取excel文件并存入两个列表1 U) S: K2 O5 h, ^2 T8 t  H
    '''
    * f2 Y, s. p/ C; w8 l6 Idata=xlrd.open_workbook(r'亚洲国家疫情数据.xlsx') * G9 ?" }' o9 |; L. g' E4 s6 j
    table  = data.sheets()[0]   #通过索引顺序获取工作表1 _0 J  X7 y8 P4 X
    cols_n = table.ncols
    7 p" l+ J) m  L! `7 L8 i) Ncountry_list = table.col_values(0,start_rowx=1) # start_rowx默认为0,设置为1去掉列名- O# T! D) }* j; I/ u/ J3 v
    data_list = table.col_values(1,start_rowx=1)4 v0 K1 T; n2 f6 t) i1 K
    # print(data_list)& ]3 t' I. [% ]( i# o  O! c# m5 u+ }
    1 [6 |, Z7 X& Y5 X. y8 W  b
    '''
    0 n# I. W* V$ k8 T7 g/ U  Q    计算角度/ z: y8 w4 V5 y( ^
    '''1 i0 a+ `) U' r' b6 W/ S3 F
    n = table.nrows-1           #去掉列名
    : S2 D% b! s3 [3 b* _theta = np.linspace(0,2*np.pi,len(data_list))    # 360度等分成n份# X& |8 R+ o( v0 R, z% \) }! J
    2 F& }0 a7 F% N2 |( ?- j
    '''0 W! U+ D+ C3 f
        作图
    0 |$ p3 {' ?- p9 p; ?) N'''
    / K  P& s/ c+ o' F3 x1 V  ]# 设置画布
    7 N9 ]0 Y# f/ I6 {, Q4 Nfig = plt.figure(figsize=(12,10))
    $ q, l, q7 B# w, o( o# 极坐标1 k1 X' q0 r) j' w/ C# J
    ax = plt.subplot(111,projection = 'polar')+ e2 q# \, G% N9 u
    # 顺时针并设置N方向为0度
    - l- ~9 {$ _% A/ k( D6 eax.set_theta_direction(-1)
      F7 N1 T2 ~9 s' z0 hax.set_theta_zero_location('N') + |5 @( b  l7 y* U; a* ^

    $ o! V! X0 l2 y4 g4 q, H1 X# 在极坐标中画柱形图
    & T- ^  T4 ~" L) e# W3 ~8 ?ax.bar(theta,
    1 z) V4 g& M/ C2 o- `% |# s7 E        data_list,' ]7 J: l) }9 Q# o
            width = 0.33,# ?% u7 v0 W2 g9 b( o( _
            color = np.random.random((len(data_list),3)),
    ; s" B: d, ~3 H3 @        # labels=str(country_list),
    8 ]! s" f* e+ `        align = 'edge')% N% p+ [+ |9 H- U
    ''' 0 t# L# q. n, t$ Q- n5 n! W
        显示一些简单的中文图例
    & `4 U" G4 a+ p9 J'''
    3 {6 k+ s4 \6 xplt.rcParams['font.sans-serif']=['SimHei']  # 黑体% r- t1 f1 e/ W  X1 e, a/ w5 s
    ax.set_title('亚洲国家现存确诊',fontdict={'fontsize':20})- U" o" z" R1 \5 n/ W
    for angle,data in zip(theta,data_list):
    ' X) c& s8 i3 M. z' M; d1 \    ax.text(angle+0.03,data+100,str(data))
    7 }1 y) ], S/ {/ C0 U
    + r+ r1 I" \: D: o9 {  W) R0 f% Y& d& P  K3 i& z
    plt.axis('off')9 `  q- e6 f' U" k

    % _) B! {6 J: r4 n9 H3 Y7 Cplt.savefig('Nightingale_rose.png'); p8 G4 d, o' i5 {1 ^* C2 |
    plt.show(); ]. I0 f8 _; [7 |6 `) p* f

    / o% Y. h  I' v/ D  v
    0 j5 x3 n: ~+ L' w- h3 h2.运行结果
    5 p% [% G5 [6 g% Y) a0 x0 p, W 1.png
    * Z' d2 @6 B* b, K' V7 k3 q- S; x; q+ V
    # N3 k0 O8 P9 C+ l! k! j+ n
    3.excel数据表
    # {7 a* E2 \8 z3 e2 \' Q6 S; o 2.png
    0 |0 |( _, W1 n2 D% l, w3 C3 t3 }0 [( ]1 F$ G) R& ~2 C
    4.说明4 {- r' [& |1 b( p/ @1 n* e% P$ e2 R
      四位数过长,而对应的图所占比例很小,所以在图上的标注有些重叠.: ?9 z# S( P& t" J9 c7 H* y* J
      实验让画出基础玫瑰图,并没有图例和标签的要求,而且给玫瑰图设置标签的步骤比较繁琐,所以没有涉及到.4 b  k3 f; }. ^" N# i
    ————————————————
    - C. ~3 s, Y1 h版权声明:本文为CSDN博主「小兰同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" Y2 E3 ~9 \& Q) |
    原文链接:https://blog.csdn.net/weixin_42323041/article/details/106263852, L1 |+ o0 U$ Z* S; p$ c9 ?1 o
    9 o* \! O+ |" W; F6 s& Q

    & \+ a/ D$ ]  ?  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-19 09:11 , Processed in 0.467397 second(s), 53 queries .

    回顶部