数学建模社区-数学中国

标题: python+matplotlib绘制南丁格尔玫瑰图 [打印本页]

作者: 杨利霞    时间: 2020-5-30 15:09
标题: python+matplotlib绘制南丁格尔玫瑰图

/ S. U! q/ _$ Dpython+matplotlib绘制南丁格尔玫瑰图+ o. g3 m3 E+ P* A5 c! Q
实验:绘制南丁格尔玫瑰图
' Z* [- x' @8 S! J7 M  本实验有一定难度,有人说matplotlib绘图和matlab大同小异,我看除了一些函数名相同之外,其他的像参数和使用方法很不一样.另外我不知道是不是在matlab中画玫瑰图直接一个"肉丝"函数就成了,为什么matplotlib里面没有~~* @- r' O/ _. W/ l
  无论如何还是感谢本次实验,虽然费了点时间但是我对函数画图有了一定深度的了解和掌握,草草在python之matplotlib库重要绘图函数简介里面记录了一下,因为内容太多没有一一写成博文,但是附加了一些别人博客的链接,还是很有帮助的.
5 f4 m- m- [: v6 o
% M8 r9 A* p% X: K2 ~文章目录
& T( Z2 u" Y% u7 Y8 X3 v* u3 i7 y- A4 T, e2 N/ C  S& S3 V
一、实验目的! F/ j* R9 o  J. {, {+ W; E* H) p$ n7 N
二、实验内容! c0 h5 E. q$ |0 a. |
三、实验环境7 R: L  u  M& _5 N
四、实验步骤
( `2 F! }% v3 o五、实验代码及测试
" A+ @, I/ X" P+ D1.源代码
5 Y" f, Z$ n, @8 ]# n2.运行结果
6 n2 k/ ]+ ~/ X, P# U; ]3.excel数据表
% o) w0 k, w# R2 |. P  i. z. B2 T  A一、实验目的) P$ A$ j- y: B+ a/ Z* W, z9 S5 w  a
; S' r" P: c6 X- p/ p
  了解玫瑰图的前世今生;了解matplotlib标准库中的pyplot模块;了解在极坐标系中绘制柱状图。
6 y2 l% A! B( V5 ]7 v3 X
" a6 v" r) }& q0 \7 y二、实验内容
6 t# [' V* ^" X& d+ f" N+ y% c) h5 i8 {
  南丁格尔玫瑰图(Nightingale rose diagram)又名鸡冠花图(Coxcomb Chart)或极坐标区域图(Polar area diagram)。它将柱图转化为更美观饼图形式,是极坐标化的柱图。不同于饼图用角度表现数值或占比,南丁格尔玫瑰图使用扇形的半径表示数据的大小,各扇形的角度则保持一致。
! w* y. l5 o( ]  自行选择一组数据,画出基础玫瑰图。
5 q; P) G. c3 v3 h. c# ^- h; M3 l' R
三、实验环境
. d2 G% N' [9 j5 O- S  u1 r9 m# P6 B9 \
  ython 3.8
1 o6 U7 U$ L% W+ o5 O& ?/ S( K5 i* p
四、实验步骤
- F' p& F  r, p) j9 i( a; w7 W: V0 B7 y# B
查阅文档,了解南丁格尔玫瑰图的原理。2 q) J* l' [: ]2 w9 [
选择一组数据,编写程序画出玫瑰图。  x; O  B0 \) T! E5 e5 }/ c
五、实验代码及测试
8 [' ]5 m. T- j8 G
0 W( i- O1 Y3 I  X) ]1.源代码5 G3 i* m/ P. B  |
6 ~9 [% D" U: \" O+ F/ D, y1 c( f
import matplotlib.pyplot as plt
& D# y9 s! R% u2 uimport numpy as np, {. i! k9 r, j  o" \
import xlrd0 Z( G. J, M5 i
4 v5 a/ u* |+ B. r6 S
'''  F" d+ V" [# Z+ v
    按列读取excel文件并存入两个列表
" z: d4 [8 t3 {9 c! w3 T'''
& H" s/ f. Y9 F# W+ X6 h" \. L$ t1 Idata=xlrd.open_workbook(r'亚洲国家疫情数据.xlsx')   q) H6 I6 ^! o
table  = data.sheets()[0]   #通过索引顺序获取工作表
" c6 f8 O+ U6 C# Fcols_n = table.ncols 8 K! `# ~) J# S/ r4 D; A4 T$ D
country_list = table.col_values(0,start_rowx=1) # start_rowx默认为0,设置为1去掉列名1 m( {/ P- M9 ~, ~2 S* x" ?3 B
data_list = table.col_values(1,start_rowx=1)
  G2 H* K4 n* m) ~# print(data_list)2 b; b0 ~: b& w% _

- X; j) G( H, p% W. e# I6 h'''1 @8 W" N. S8 z; b
    计算角度$ M1 i. K) R" W0 t
'''
* z9 Q( R7 F# C5 g6 Xn = table.nrows-1           #去掉列名
. l* f0 H- g6 l3 u1 Stheta = np.linspace(0,2*np.pi,len(data_list))    # 360度等分成n份2 x2 e, M+ x6 j6 ^3 p& C; N

! k  ?' T, \: W'''3 k& S! u% H! _
    作图
5 _& s* D5 W4 B2 |'''8 J) c4 T9 S9 j1 O+ F% r
# 设置画布
4 v7 Q( y- j% y: ~fig = plt.figure(figsize=(12,10))
+ f4 B3 R$ c; `0 l/ Y$ s; ?1 J# 极坐标0 \& V$ {! W5 N! c
ax = plt.subplot(111,projection = 'polar')
* |# R/ ^. u6 b, `# 顺时针并设置N方向为0度5 X/ V" O4 B0 K5 D2 ?- _
ax.set_theta_direction(-1), W8 O/ r1 I! }
ax.set_theta_zero_location('N')
6 z$ l+ g* a# ]9 W  z2 G( d) }7 [, `# T6 o8 p! M% G/ a
# 在极坐标中画柱形图2 S6 K$ @- W0 r* a: W
ax.bar(theta,
: @% U; m$ d3 l+ Y# F% R        data_list,
' ~! U% z; x1 n3 r* _) e! u4 o  {        width = 0.33,
% ^7 W5 p- x2 u- Q        color = np.random.random((len(data_list),3)),9 u; H4 s2 h- x+ G8 A  K& E
        # labels=str(country_list),
4 x' r& P' y. b        align = 'edge')
/ _- t6 D" C! p" R9 C'''
3 q# \. h  I2 E$ N' Q0 o    显示一些简单的中文图例6 u' ?3 ?/ t% ~- t' I/ d4 M" S
'''
; ]8 x0 g, u% Wplt.rcParams['font.sans-serif']=['SimHei']  # 黑体* I$ [: L& b' q! q% n
ax.set_title('亚洲国家现存确诊',fontdict={'fontsize':20})
2 x1 {7 B& Y9 x6 xfor angle,data in zip(theta,data_list):
0 T/ V' m2 T+ V  u4 j$ \    ax.text(angle+0.03,data+100,str(data)) ! B' d6 d. q4 P# ?+ K1 B6 R" R
  i  x' ?3 G" c- q
1 E: \8 ~, g9 R2 L6 ~
plt.axis('off')
' x( M/ R2 X4 ~) G8 ]! m5 }- e
4 F2 d. V4 x# }6 a8 v1 Bplt.savefig('Nightingale_rose.png')
, z! h% E3 h" c* B, M8 c5 o$ lplt.show()6 g) j& u8 N/ G7 Q8 t7 J
! L! ?, t9 e. p" Z3 d2 P5 ^

/ E: B1 g$ b" Z% Q/ m# A2.运行结果
  `# O* o# j" {, b" w4 W8 l# ~ 1.png % @2 ^# Y# t' F* B1 z+ l

: N* `' A2 ^) A' j! }. H2 X& n  o; k/ b- m
3.excel数据表
$ T7 F" w$ F  N* B 2.png $ x: u# Q/ C) R( C; ~
/ F* U" j* ?1 E- q. ~* p
4.说明
* y9 J( @8 I( k+ \4 L4 w  四位数过长,而对应的图所占比例很小,所以在图上的标注有些重叠.
* w+ V  s* Q5 @8 u: v  实验让画出基础玫瑰图,并没有图例和标签的要求,而且给玫瑰图设置标签的步骤比较繁琐,所以没有涉及到.. }& W' d9 u, C
————————————————6 E: S' H. O/ w% h+ O
版权声明:本文为CSDN博主「小兰同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: J% t. B/ {& `4 a9 c; v, B
原文链接:https://blog.csdn.net/weixin_42323041/article/details/106263852
1 |/ S9 y3 k9 F5 R" u$ N* E1 O7 p  b3 @( v
- q" V* y) C3 h+ v% {% R6 N





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5