《大数据审计》上机实验记录

学习目标:

课程要求是本学期,掌握Python基本语法并且读取文件数据,进行图像绘制。
提示:《Big data audit》2020年秋季开课


第一次上机

Description:

  1. 使用spyder,用python编写计算m到n之间所有偶数相加的和的函数(包含m和n),当发现m>n时,返回-1。
  2. 并测试下列数据:
  • m=1,m=100
  • m=4,n=4
  • m=-100,n=-1
  • m=-6,n=6
  • m=3,n=3
  • m=9,n=8

Answer:

Case One:

# 这是老师的方法
def summary(m,n):
    s=0
    if m>n:
        s=-1
    else:
        for i in range(m,n+1):
            if i%2==0:
                s=s+i
    return s

Case Two:

#这是本人的方法
# int[]
def generateList(m,n):
    sum=0
    x=m
    y=n
    L=[]
    if(m>n):
        print("你的输入有误")
        return
    while(m<=n):
        if(m%2==0):
            L.append(m)
            sum+=m
        m=m+1        
    print (L)
    print("在%d, %d之间的偶数之和为%d" %(x,y,sum))
   

# int[]
generateList(9,8) 

第二次上机

Description:
读取iris数据集中的花萼长度数据(已保存为csv格式),并对其进行排序、去重,求出和、累积和、均值、标准差、方差、最小值、最大值。(注:读取文件请使用np.loadtxt函数)

Answer:

  1. “Case One:”
# -*- coding: utf-8 -*-
"""
Created on Sat Oct 17 11:33:24 2020

@author: yyds
"""

# 导入numpy数据库
import numpy as np
# 将iris.csv数据进行加载(一定要对绝对路径加上引号)
# delimiter将字段以逗号分隔进行切片。默认的cvs文件中字段中数据都是以逗号进行分割的。

raw_data=np.loadtxt('D:/Spyder_data/source/iris.csv',delimiter=',',skiprows=1,dtype=str)

# print(raw_data)   


'''
对花萼进行排序
'''
# argsort 可以指定列进行排序,返回的数组下标。
data_sort=raw_data[np.argsort(raw_data[:,1])]
print('~~~~~~~')
print(data_sort)
print('~~~~~~~')
'''
对花萼进行去重
'''
# 使用unique进行去重。
# data_unique=np.unique(raw_data)
# print(data_unique)

'''
对花萼进行求和
'''
# 读取文件中,花萼长度的数值一列。
raw=np.loadtxt('D:/Spyder_data/source/iris.csv',delimiter=',',skiprows=1,dtype=float,usecols=[1])
#print(raw)

# 在对于花萼长度列进行去重处理。
raw_unique=np.unique(raw)
print(raw_unique)
print(sum(raw_unique))

# 求累积和
raw_cumsum=np.cumsum(raw_unique)
print(raw_cumsum)

# 求均值
raw_average=np.average(raw_unique)
print(raw_average)

# 标准值
raw_std=np.std(raw_unique)
print(raw_std)

# 方差
print(np.var(raw_unique))

# 最小值或最大值
print(np.min(raw_unique))
print(np.max(raw_unique))
  1. Case Two:
# -*- coding: utf-8 -*-
"""
Created on Mon Nov  2 18:31:31 2020

@author: yyds
"""

import numpy as np
arr=np.loadtxt('D:/Spyder_data/source/iris.csv',skiprows=1,usecols=1,delimiter=',',dtype=float)
print('arr是:',arr)
arr.sort()
print('排序后:',arr)
uniarr=np.unique(arr)
print('去重后:',uniarr)
arr_sum=np.sum(uniarr,dtype=None) #总值
arr_sum=np.mean(uniarr,dtype=None) #均值
arr_std=np.std(uniarr) #标准差
arr_var=np.var(uniarr) #方差
arr_min=np.min(uniarr) #最小值
arr_max=np.max(uniarr) #最大值

第三次上机

Description:
举例 散点图 (利用散点图展示数据特征间的关系)

代码如下(示例):

# -*- coding: utf-8 -*-
"""
Created on Thu Oct 22 13:35:34 2020

@author: yyds
"""

import matplotlib.pyplot as plt 
import numpy as np
plt.figure(figsize=(10,10))  #创建4*4画布
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False  
x=np.arange(50)
plt.plot(x,np.sin(x))
plt.plot(x,np.cos(x))
plt.title('sin_cos')
plt.xlabel("x_value")
plt.ylabel("y_value")
plt.legend(["sin x",'cos x'])
plt.show()

# In[]
import matplotlib.pyplot as plt 
import numpy as np
data = np.load("D:\Spyder_data\国民经济核算季度数据.npz",allow_pickle=True)
print(data.files)
print(data['columns'])
print(data['values'])
plt.scatter(np.arange(69),data['values'][:,2])

# In[]
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False  
plt.title('2000-2007年季度国内生产总值情况')
plt.xlabel("年度季度")
plt.ylabel("生产总值")
plt.xticks(np.arange(0,69,4),data['values'][::4,1],rotation=90)
plt.scatter(np.arange(69),data["values"][:,2])

# In[]
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False  
plt.title('2000-2007年季度国内生产总值情况')
plt.xlabel("年度季度")
plt.ylabel("生产总值")
plt.xticks(np.arange(0,69,4),data['values'][::4,1],rotation=90)
for i in (3,4,5):
    plt.scatter(np.arange(69),data['values'][:,i])
plt.legend(['第一产业','第二产业','第三产业'])
plt.show()

# In[]
import matplotlib.pyplot as plt 
import numpy as np
import random
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False  
x = range(0, 60)  #设置取值范围为0~120,取得值用作分钟数,既 0到60分钟
temperature = [random.randint(20,35) for i in range(60)]  # 取范围在20~35之间的随机数,总数为60个
print(temperature)
plt.figure(figsize=(100,100)) 
plt.xticks(np.arange(0,60,5))
plt.yticks(np.arange(0,35,5),temperature)
plt.plot(x,temperature)
plt.title("11点0分到12点之间北京和南京的温度变化图")
plt.xlabel("时间")
plt.ylabel("温度")
plt.legend(["南京","北京","南京均温","北京均温"])
plt.show()

Description:
在这里插入图片描述

本人代码如下(示例):

# -*- coding: utf-8 -*-
"""
Created on Thu Oct 22 15:13:39 2020

@author: yyds
"""

import matplotlib.pyplot as plt 
import numpy as np
import random
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False  
x = range(0, 60)  #设置取值范围为0~120,取得值用作分钟数,既 0到60分钟
temperature_n = [random.randint(5,12) for i in range(60)]  # 取范围在20~35之间的随机数,总数为60个
temperature_b = [random.randint(15,25) for i in range(60)]
average_n=np.mean(temperature_n)
average_b=np.mean(temperature_b)
aver_b=np.zeros([60])+average_b
aver_n=np.zeros([60])+average_n
plt.figure(figsize=(8,8)) 
plt.xlim(0,60)
plt.xticks(np.arange(0,65,5))
plt.ylim(0,35)
plt.yticks(np.arange(0,40,5))
plt.plot(x,temperature_n,color="blue",linestyle="-")
plt.plot(x,temperature_b,color="red",linestyle="--")
plt.plot(x,aver_n,marker="*",color="purple")
plt.plot(x,aver_b,marker="o", color="cyan")
plt.title("11点0分到12点之间北京和南京的温度变化图")
plt.xlabel("时间")
plt.ylabel("温度")
plt.legend(["南京","北京","南京均温","北京均温"])
plt.show()

运行结果:
在这里插入图片描述
老师代码如下(示例):

# -*- coding: utf-8 -*-
"""
Created on Mon Nov  2 19:33:45 2020

@author: yyds
"""

import matplotlib.pyplot as plt
import numpy as np

# 中文显示问题--下面手动修改配置
plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 准备x,y轴数据
x=np.arange(60)
y_nj=np.random.randint(15,25,60)
y_bj=np.random.randint(5,12,60)
y_njAvgV=np.mean(y_nj)
y_bjAvgV=np.mean(y_bj)
y_njAvgA=np.zeros([60])+y_njAvgV
y_bjAvgA=np.zeros([60])+y_bjAvgV

plt.xticks(np.linspace(0,60,13))
plt.yticks(np.linspace(0,35,8))
plt.xlim(0,60)
plt.ylim(0,35)
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("11点0分到12点之间北京和南京的温度变化图")

# 创建画布---多个坐标,绘制折线图
plt.plot(x,y_nj,label="南京",color="b",linestyle='-')
plt.plot(x,y_bj,label="北京",color="r",linestyle="--")
plt.plot(x,y_njAvgA,label='南京均温',color="m",marker="*")
plt.plot(x,y_njAvgA,label="北京均温",color="c",marker="x")

plt.legend()
plt.savefig("温度.jpg")
plt.show()

运行结果:
在这里插入图片描述

Description:
在这里插入图片描述

本人代码如下(示例):

# -*- coding: utf-8 -*-
"""
Created on Sat Oct 24 21:49:49 2020

@author: yyds
"""

import matplotlib.pyplot as plt 
import numpy as np
# allow_pickle=False 默认为False,意思是无法加载数组对象。
data = np.load("d:\Spyder_data\populations.npz",allow_pickle=True)
# 查看数组元素
print(data.files) 
print(data['data'])
print(data['feature_names'])

plt.rcParams['font.sans-serif']='SimHei'#设置中文显示
name=data['feature_names']#提取其中的feature_names数组,视为数据的标签
values=data['data']#提取其中的data数组,视为数据的存在位置

# 散点图
p1=plt.figure(figsize=(30,30))  
p_sub=p1.add_subplot(2,2,1)#创建一个两行一列的子图并开始绘制
#在子图上绘制散点图
plt.scatter(values[0:20,0],values[0:20,1],marker='8',color='red')
plt.ylabel('总人口(万人)')
plt.legend('年末')
plt.title('1996~2015年末与各类人口散点图')


p_sub=p1.add_subplot(2,2,3)#绘制子图2
plt.scatter(values[0:20,0],values[0:20,2],marker='o',color='orange')
plt.scatter(values[0:20,0],values[0:20,3],marker='D',color='green')
plt.scatter(values[0:20,0],values[0:20,4],marker='p',color='blue')
plt.scatter(values[0:20,0],values[0:20,5],marker='s',color='purple')
plt.xlabel('时间')
plt.ylabel('总人口(万人)')
plt.xticks(values[0:20,0])
plt.legend(['男性','女性','城镇','乡村'])
# plt.savefig("d:\Spyder_data\population1.png")


# 年末总人口折线图
# p2=plt.figure(figsize=(12,12))
p_sub=p1.add_subplot(2,2,2) # 创建一个子图并开始绘制
#在子图上绘制折线图
plt.plot(values[0:20,0],values[0:20,1],marker="_", color="red")
plt.ylabel('总人口(万人)')
plt.legend('年末')
plt.title('1996~2015年末与各类人口折线图')

# 详细的人口折线图
p_sub=p1.add_subplot(2, 2, 4) # 创建了子图开始绘制
plt.plot(values[0:20,0],values[0:20,2],marker='o', color='orange')
plt.plot(values[0:20,0],values[0:20,3],marker='D', color='green')
plt.plot(values[0:20,0],values[0:20,4],marker='p', color='blue')
plt.plot(values[0:20,0],values[0:20,5],marker='s', color='purple')
plt.xlabel('时间')
plt.ylabel("总人口(万人)")
plt.legend(['男性','女性','城镇','乡村'])
plt.xticks(values[0:20,0])
plt.savefig("d:\Spyder_data\population.png")
plt.show()

运行结果:
在这里插入图片描述
班级同学优秀代码如下(示例):

# -*- coding: utf-8 -*-
"""
Created on Sun Oct 25 17:11:07 2020

@author: Echo
"""

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
fig, (ax0, ax1) = plt.subplots(nrows=2, ncols=1, sharex=True,figsize=(14, 12))
df = np.load('d:\Spyder_data\populations.npz',allow_pickle='True')
#print(df['feature_names'][1:])
#print(df['data'])
x = np.arange(20)
y = df['data'][:-2] #从不包括-2位置的元素往前取元素。


ax0.set_title('1996-2015年总人口、男女、城镇人口散点图')
ax0.scatter(y[::-1,0],y[::-1,1]) #y[::-1,0] 取从后向前(相反)的第0列元素
ax0.scatter(y[::-1,0],y[::-1,2],marker='o',color='y')
ax0.scatter(y[::-1,0],y[::-1,3],marker='x',color='g')
ax0.scatter(y[::-1,0],y[::-1,4],marker='*',color='b')
ax0.scatter(y[::-1,0],y[::-1,5],marker='s',color='m')
ax0.set_ylabel("总人口(万人)")
ax0.legend(df['feature_names'][1:])

ax1.set_title('1996-2015年总人口、男女、城镇任娄折线图')
ax1.plot(y[::-1,0],y[::-1,1],marker='1')
ax1.plot(y[::-1,0],y[::-1,2],marker=4,color='y')
ax1.plot(y[::-1,0],y[::-1,3],marker=5,color='g')
ax1.plot(y[::-1,0],y[::-1,4],marker=6,color='b')
ax1.plot(y[::-1,0],y[::-1,5],marker=7,color='m')
ax1.set_ylabel("总人口(万人)")
ax1.legend(df['feature_names'][1:]) #图例从"男性人口"遍历到"乡村人口"
plt.suptitle("1996-2015年总人口、男女、城乡人口散点、折线图") #绘制总标题
plt.xticks(rotation='45')
plt.savefig('population.png')
plt.show()



第四次上机

本人的代码:

# -*- coding: utf-8 -*-
"""
Created on Thu Nov  5 15:08:37 2020

@author: yyds
"""

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['FangSong'] 
plt.rcParams['axes.unicode_minus'] = False
p1=plt.figure(figsize=(30,30)) 
p_sub=p1.add_subplot(3,4,1)
data=np.load("d:\Spyder_data\populations.npz",allow_pickle='True' )
print(data['feature_names'])
print(data['data'])
plt.ylabel('人口(万人)')
plt.title("1996年男、女人口数直方图")
num=data['data'][19,2:4]
plt.bar(range(len(num)),num,color="orange")
plt.xticks(range(len(num)),["男性","女性"])

p_sub=p1.add_subplot(3,4,5)

plt.ylabel('人口(万人)')
plt.title("1996年城、乡人口数直方图")
plt.ylabel('人口(万人)')
plt.title("1996年男、女人口数直方图")
num=data['data'][19,4:6]
plt.bar(range(len(num)),num,color="orange")
plt.xticks(range(len(num)),["城镇","乡村"])

p_sub=p1.add_subplot(3,4,2)
plt.ylabel('人口(万人)')
plt.title("2015年男、女人口数直方图")
plt.xlabel("类别")
num=data['data'][1,2:4]
plt.bar(range(len(num)),num,color='red')
plt.xticks(range(len(num)),['男性','女性'])

p_sub=p1.add_subplot(3,4,6)
plt.ylabel('人口(万人)')
plt.title("2015年城、乡人口数直方图")
plt.xlabel("类别")
num=data['data'][1,4:6]
plt.bar(range(len(num)),num,color='red')
plt.xticks(range(len(num)),['城','乡'])


p_sub=p1.add_subplot(3,4,3)
dis=0
sp=[0,0]
labels=['男性','女性']
sizes=[data['data'][19,2]/data['data'][19,1],data['data'][19,3]/data['data'][19,1]]
plt.pie(sizes,explode=sp,labels=labels,colors=['pink','crimson'],autopct="%1.1f%%",startangle=15)
plt.title("1996年男、女人口数饼图")


p_sub=p1.add_subplot(3,4,7)
dis=0
sp=[0,0]
labels=['城镇','乡村']
sizes=[data['data'][19,4]/data['data'][19,1],data['data'][19,5]/data['data'][19,1]]
plt.pie(sizes,explode=sp,labels=labels,colors=['pink','crimson'],autopct="%1.1f%%",startangle=15)
plt.title("1996年城、乡人口数饼图")

p_sub=p1.add_subplot(3,4,4)
dis=0
sp=[0,0]
labels=['男性','女性']
sizes=[data['data'][1,2]/data['data'][1,1],data['data'][1,3]/data['data'][1,1]]
plt.pie(sizes,explode=sp,labels=labels,colors=['PeachPuff','skyblue'],autopct="%1.1f%%",startangle=15)
plt.title("2015年男、女人口数饼图")


p_sub=p1.add_subplot(3,4,8)
dis=0
sp=[0,0]
labels=['城镇','乡村']
sizes=[data['data'][1,4]/data['data'][1,1],data['data'][1,5]/data['data'][1,1]]
plt.pie(sizes,explode=sp,labels=labels,colors=['PeachPuff','skyblue'],autopct="%1.1f%%",startangle=15)
plt.title("2015年城、乡人口数饼图")

p2=plt.figure(figsize=(30,30))
p_sub=p2.add_subplot(3,4,9)
plt.boxplot(data['data'][1:20,1:6],notch=True,labels=['年末','男性','女性','城镇','乡村'],meanline=True)
plt.xlabel('类别')
plt.ylabel('人口(万人)')
plt.title('1996~2015年各特征人口箱线图')

实验结果:

在这里插入图片描述
在这里插入图片描述
课后作业范例代码(数据集字段选取9月21日):
https://raw.githubusercontent.com/canghailan/Wuhan-2019-nCoV/master/Wuhan-2019-nCoV.csv

# -*- coding: utf-8 -*-
"""
Created on Sat Nov  7 13:22:00 2020

@author: yyds
"""

#coding:utf-8
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def rosetype_pie(country,confirmed,size,colors):
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文显示

    num= len(size) # 柱子的数量
    width = 2 * np.pi / num # 每个柱子的宽度
    rad = np.cumsum([width] * num)  # 每个柱子的角度
    
    plt.figure(figsize=(8, 8),dpi=500,)  # 创建画布
    ax = plt.subplot(projection='polar')
    ax.set_ylim(-1, np.ceil(max(size) + 1))  # 中间空白,-1为空白半径大小,可自行调整
    ax.set_theta_zero_location('N',-5.0)  # 设置极坐标的起点方向 W,N,E,S, -5.0为偏离数值,可自行调整
    ax.set_theta_direction(1) # 1为逆时针,-1为顺时针
    ax.grid(False)  # 不显示极轴
    ax.spines['polar'].set_visible(False)  # 不显示极坐标最外的圆形
    ax.set_yticks([])  # 不显示坐标间隔
    ax.set_thetagrids([])  # 不显示极轴坐标

    ax.bar(rad, size, width=width, color=colors, alpha=1) # 画图
    ax.bar(rad, 1, width=width, color='white', alpha=0.15)  # 中间添加白色色彩使图案变浅
    ax.bar(rad, 3, width=width, color='white', alpha=0.1)  # 中间添加白色色彩使图案变浅
    ax.bar(rad, 5, width=width, color='white', alpha=0.05)  # 中间添加白色色彩使图案变浅
    ax.bar(rad, 7, width=width, color='white', alpha=0.03)  # 中间添加白色色彩使图案变浅

    # 设置text
    for i in np.arange(num):
        if i < 8:
            ax.text(rad[i],  # 角度
                    size[i]-0.2,  # 长度
                    country[i]+'\n'+str(confirmed[i])+'例',  # 文本
                    rotation=rad[i] * 180 / np.pi -5,  # 文字角度
                    rotation_mode='anchor',
                    # alpha=0.8,#透明度
                    fontstyle='normal',# 设置字体类型,可选参数[ ‘normal’ | ‘italic’ | ‘oblique’ ],italic斜体,oblique倾斜
                    fontweight='black', # 设置字体粗细,可选参数 [‘light’, ‘normal’, ‘medium’, ‘semibold’, ‘bold’, ‘heavy’, ‘black’]
                    color='white', # 设置字体颜色
                    size=size[i]/2.2, # 设置字体大小
                    ha="center", # 'left','right','center'
                    va="top", # 'top', 'bottom', 'center', 'baseline', 'center_baseline'
                    )
        elif i < 15:
            ax.text(rad[i]+0.02,
                    size[i]-0.7,
                    country[i] + '\n' + str(confirmed[i]) + '例',
                    fontstyle='normal',
                    fontweight='black',
                    color='white',
                    size=size[i] / 1.6,
                    ha="center",
                    )
        else:
            ax.text(rad[i],
                    size[i]+0.1,
                    str(confirmed[i]) + '例 ' + country[i],
                    rotation=rad[i] * 180 / np.pi + 85,
                    rotation_mode='anchor',
                    fontstyle='normal',
                    fontweight='black',
                    color='black',
                    size=4,
                    ha="left",
                    va="bottom",
                    )

    plt.show()


if __name__ == '__main__':
    df = pd.read_csv('D:\Wuhan-2019-nCoV_09_21.csv') # 利用pandas读取数据
    colors = [(0.68359375, 0.02734375, 0.3203125),
                    (0.78125, 0.05078125, 0.2578125),
                    (0.875, 0.0390625, 0.1796875),
                    (0.81640625, 0.06640625, 0.0625),
                    (0.8515625, 0.1484375, 0.08203125),
                    (0.90625, 0.203125, 0.13671875),
                    (0.89453125, 0.2890625, 0.0703125),
                    (0.84375, 0.2421875, 0.03125),
                    (0.9140625, 0.26953125, 0.05078125),
                    (0.85546875, 0.31640625, 0.125),
                    (0.85546875, 0.3671875, 0.1171875),
                    (0.94921875, 0.48046875, 0.28125),
                    (0.9375, 0.51171875, 0.1484375),
                    (0.93359375, 0.59765625, 0.0625),
                    (0.93359375, 0.62890625, 0.14453125),
                    (0.86328125, 0.5859375, 0.15234375),
                    (0.86328125, 0.71875, 0.16015625),
                    (0.86328125, 0.8203125, 0.16015625),
                    (0.76171875, 0.8671875, 0.16015625),
                    (0.53125, 0.85546875, 0.15625),
                    (0.4765625, 0.94140625, 0.0703125),
                    (0.21484375, 0.91015625, 0.0625),
                    (0.15234375, 0.88671875, 0.08203125),
                    (0.11328125, 0.87890625, 0.19921875),
                    (0.11328125, 0.8125, 0.1796875),
                    (0.1875, 0.76953125, 0.2109375),
                    (0.2109375, 0.78125, 0.38671875),
                    (0.1484375, 0.76953125, 0.30859375),
                    (0.22265625, 0.73046875, 0.35546875),
                    (0.2890625, 0.6875, 0.4765625)] # 转化为小数的rgb色列表,
    df_top_confirmed = df.loc[(df['date'] == '2020-09-21') & (df['province'].isnull())].sort_values('confirmed',ascending=False).head(30) # 选择9.21日确诊数前三十的国家
    country = df_top_confirmed['country'].tolist()
    confirmed = df_top_confirmed['confirmed'].tolist()
    size = [22 , 19, 17, 12, 11, 10, 9, 8, 7.2, 7.0, 6.8, 6.6, 6.4, 6.2, 6.0, 5.8, 5.6, 5.4, 5.2, 5.0, 4.8, 4.6, 4.4, 4.2, 4.0, 3.8, 3.6, 3.4, 3.2, 3.0] # 自定义一个柱长度列
    rosetype_pie(country, confirmed, size, colors)


运行结果:

在这里插入图片描述
课后作业有图标的代码(数据集字段选取9月21日):

# -*- coding: utf-8 -*-
"""
Created on Sat Nov  7 15:11:14 2020

@author: yyds
"""

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
def rosetype_pie(country,confirmed,size,colors):
    plt.rcParams['font.sans-serif'] = ['SimHei']  

    num= len(size) 
    width = 2 * np.pi / num
    rad = np.cumsum([width] * num)  
    
    plt.figure(figsize=(20, 20),dpi=500,)  
    ax = plt.subplot(projection='polar')
    ax.set_ylim(-1, np.ceil(max(size) + 1)) 
    ax.set_theta_zero_location('N',-5.0)  
    ax.set_theta_direction(1) 
    ax.grid(False)  
    ax.spines['polar'].set_visible(False)  
    ax.set_yticks([])  
    ax.set_thetagrids([])  

    ax.bar(rad, size, width=width, color=colors, alpha=1) 
    ax.bar(rad, 1, width=width, color='white', alpha=0.15)  
    ax.bar(rad, 3, width=width, color='white', alpha=0.1)  
    ax.bar(rad, 5, width=width, color='white', alpha=0.05) 
    ax.bar(rad, 7, width=width, color='white', alpha=0.03) 

    # 设置text
    for i in np.arange(num):
        if i < 8:
            ax.text(rad[i],  
                    size[i]-0.2,  
                    country[i]+'\n'+str(confirmed[i])+'例',  
                    rotation=rad[i] * 180 / np.pi -5,  
                    rotation_mode='anchor',
                   
                    fontstyle='normal',
                    fontweight='black', 
                    color='white',
                    size=size[i]/2.2, 
                    ha="center",
                    va="top", 
                    )
        elif i < 15:
            ax.text(rad[i]+0.02,
                    size[i]-0.7,
                    country[i] + '\n' + str(confirmed[i]) + '例',
                    fontstyle='normal',
                    fontweight='black',
                    color='white',
                    size=size[i] / 1.6,
                    ha="center",
                    )
        else:
            ax.text(rad[i],
                    size[i]+0.1,
                    str(confirmed[i]) + '例 ' + country[i],
                    rotation=rad[i] * 180 / np.pi + 85,
                    rotation_mode='anchor',
                    fontstyle='normal',
                    fontweight='black',
                    color='black',
                    size=4,
                    ha="left",
                    va="bottom",
                    )
    plt.title("全球新冠肺炎疫情",fontsize="70",horizontalalignment="right")
    df_down_confirmed = df.loc[(df['date'] == '2020-09-21') & (df['province'].isnull())].sort_values('confirmed',ascending=False).tail(30) 

    country_down = df_down_confirmed['country'].tolist()
    print(country_down)
    confirmed_down=df_down_confirmed['confirmed'].tolist()
    print(confirmed_down)
    cell_width = 212  
    cell_height = 22
    swatch_width= 1
    axes_kwargs={"fc":"#000000"}
    axins1=inset_axes(ax,width=39*0.18, height=35*0.16, loc=1)
    n = 30
    ncols = 2
    nrows = n // ncols + int(n % ncols > 0) 
    axins1.set_xlim(0,cell_width*2)
    axins1.set_ylim(cell_height* (nrows-0.5),-cell_height/2.)
    axins1.yaxis.set_visible(False)
    axins1.xaxis.set_visible(False)
    axins1.set_axis_off()
    for i in range(n):
        
         row = i % nrows
         col = i // nrows
         y = row * cell_height
         swatch_start_x = cell_width * col
         swatch_end_x = cell_width * col + swatch_width
         text_pos_x = cell_width * col + swatch_width + 10
         axins1.text(text_pos_x-35, y, str(confirmed_down[i]), fontsize=15,
                    horizontalalignment='left',
                    verticalalignment='center',
                    backgroundcolor="hotpink")
         axins1.text(text_pos_x, y, country_down[i], fontsize=15,
                    horizontalalignment='left',
                    verticalalignment='center')
    plt.show()


if __name__ == '__main__':
    df = pd.read_csv('D:\data_set.csv') 
    colors = [(0.68359375, 0.02734375, 0.3203125),
                    (0.78125, 0.05078125, 0.2578125),
                    (0.875, 0.0390625, 0.1796875),
                    (0.81640625, 0.06640625, 0.0625),
                    (0.8515625, 0.1484375, 0.08203125),
                    (0.90625, 0.203125, 0.13671875),
                    (0.89453125, 0.2890625, 0.0703125),
                    (0.84375, 0.2421875, 0.03125),
                    (0.9140625, 0.26953125, 0.05078125),
                    (0.85546875, 0.31640625, 0.125),
                    (0.85546875, 0.3671875, 0.1171875),
                    (0.94921875, 0.48046875, 0.28125),
                    (0.9375, 0.51171875, 0.1484375),
                    (0.93359375, 0.59765625, 0.0625),
                    (0.93359375, 0.62890625, 0.14453125),
                    (0.86328125, 0.5859375, 0.15234375),
                    (0.86328125, 0.71875, 0.16015625),
                    (0.86328125, 0.8203125, 0.16015625),
                    (0.76171875, 0.8671875, 0.16015625),
                    (0.53125, 0.85546875, 0.15625),
                    (0.4765625, 0.94140625, 0.0703125),
                    (0.21484375, 0.91015625, 0.0625),
                    (0.15234375, 0.88671875, 0.08203125),
                    (0.11328125, 0.87890625, 0.19921875),
                    (0.11328125, 0.8125, 0.1796875),
                    (0.1875, 0.76953125, 0.2109375),
                    (0.2109375, 0.78125, 0.38671875),
                    (0.1484375, 0.76953125, 0.30859375),
                    (0.22265625, 0.73046875, 0.35546875),
                    (0.2890625, 0.6875, 0.4765625)] 
    df_top_confirmed = df.loc[(df['date'] == '2020-09-21') & (df['province'].isnull())].sort_values('confirmed',ascending=False).head(30) 
    country = df_top_confirmed['country'].tolist()
    confirmed = df_top_confirmed['confirmed'].tolist()
    size = [22 , 19, 17, 12, 11, 10, 9, 8, 7.2, 7.0, 6.8, 6.6, 6.4, 6.2, 6.0, 5.8, 5.6, 5.4, 5.2, 5.0, 4.8, 4.6, 4.4, 4.2, 4.0, 3.8, 3.6, 3.4, 3.2, 3.0] 
    rosetype_pie(country, confirmed, size, colors)
  

运行结果:

在这里插入图片描述
WJY大佬的源码(需要timeseries.json数据集):
https://download.csdn.net/download/aiboom/13099499

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""

import  matplotlib.pyplot as plt 
import numpy as np
import matplotlib.colors as mcolors
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
# In[0]
import json
data=json.load(open("C:\\Users\\haoyu\\Desktop\\parsedata\\timeseries.json"))
day=55#2020-3-17
temp=[]
with open("{}_day".format(day),"w") as target:
    for key in data.keys():
        daydate=data[key][day]
        daydate["nation"]=key
        temp.append(daydate)
dat=sorted(temp, key = lambda i:i["confirmed"],reverse=True)
nations=[]
for i in dat:
    nations.append(i["nation"])
# In[1]

N=50
fig=plt.figure(figsize=(30,30))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

ax1=fig.add_subplot(121)

theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = np.linspace(30, 120, N, endpoint=False)
theta=theta[::-1]
width = np.pi*2/N
colors = plt.cm.viridis((radii-radii[0])/(radii[N-1]-radii[0]))
colors=colors[::-1]
colors=colors[:,[0,1,2,3]]
ax = plt.subplot(111, projection='polar')
ax.grid(False)
ax.set_xticks([]) 
ax.set_yticks([])
ax.spines['polar'].set_visible(False)
ax.set_theta_zero_location("N",offset=5)
ax.bar(theta, radii, width=width, bottom=0.0, color=colors)
ax.fill(theta, [8]*N, color="w")
tempdata=dat[:N]
tempdata=tempdata[::-1]
split=23
rotations=np.linspace(90,-270,N, endpoint=False)
for i in range(N-split):
    ax.text(theta[i]-0.02,radii[i]+11,tempdata[i]["nation"]+"\n"+str(tempdata[i]["confirmed"]),rotation=rotations[i],ha="center"
            ,fontsize=20)
for i in range(N-split,N):
    ax.text(theta[i],radii[i]-11,tempdata[i]["nation"]+"\n"+str(tempdata[i]["confirmed"]),ha="center"
            ,fontsize=20,color="w",weight="semibold")
plt.title("全球新冠肺炎疫情",fontsize="99",horizontalalignment="right")


cell_width = 212
cell_height = 22
swatch_width= 1
axes_kwargs={"fc":"#000000"}
axins1=inset_axes(ax,width=30*0.17, height=30*0.3, loc=1)
n = len(dat)-N-100
ncols = 2
nrows = n // ncols + int(n % ncols > 0)
# dat=dat[N:]
labeldata=dat[N:]
axins1.set_xlim(0,cell_width*2)
axins1.set_ylim(cell_height* (nrows-0.5),-cell_height/2.)
axins1.yaxis.set_visible(False)
axins1.xaxis.set_visible(False)
axins1.set_axis_off()
ax
for i in range(n):
    
     row = i % nrows
     col = i // nrows
     y = row * cell_height
     swatch_start_x = cell_width * col
     swatch_end_x = cell_width * col + swatch_width
     text_pos_x = cell_width * col + swatch_width + 10
     axins1.text(text_pos_x-35, y, str(labeldata[i]["confirmed"]), fontsize=15,
                horizontalalignment='left',
                verticalalignment='center',
                backgroundcolor="hotpink")
     axins1.text(text_pos_x, y, labeldata[i]["nation"], fontsize=15,
                horizontalalignment='left',
                verticalalignment='center')
     
plt.savefig("D://ex2.png")
plt.show()

运行结果:
在这里插入图片描述

WJY大佬的代码"魔改":

# -*- coding: utf-8 -*-
"""
Created on Sun Nov  8 22:09:17 2020

@author: yyds
"""


import  matplotlib.pyplot as plt 
import numpy as np
import matplotlib.colors as mcolors
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
# In[0]  
'''
第一区块,对所有的json数据结构进行处理。
'''
import json
data=json.load(open("D:\\timeseries.json"))  #打开json文件存到data变量中
# print(data["China"][55])
# print(len(data))  # 一共188个国家的疫情数据。

day=55#2020-3-17 #json数据索引从0~55
temp=[]  #临时的空列表
with open("{}_day".format(day),"w") as target:  #执行指定格式的输出,并赋值给target变量。
    for key in data.keys():   #遍历data.json中key=‘国家’。
        daydate=data[key][day] #将data.json文件中的数据中,2020-3-17的数据全部存到了daydate键值对中。
        daydate["nation"]=key  #将nation值=国家名
        temp.append(daydate)   #将daydate字典追加到temp列表中。
# print(temp)
# sorted(iterable, key=None, reverse=False)第一个参数迭代对象,第二个是用来比较的元素列,第三个是排序规则  

dat=sorted(temp, key = lambda i:i["confirmed"],reverse=True) #将排列好的列表中的字典赋值给dat遍历。
nations=[] #定义一个nations列表。
#将dat排好序的列表,取出“nation”国家键值对尾追加到nations列表中。
for i in dat: 
    nations.append(i["nation"])
# In[1]
'''
第二区块,进行图像绘制
'''
N=50  #确定绘制图形的数量。
fig=plt.figure(figsize=(30,30))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

ax1=fig.add_subplot(121) #121将画布分割成1行2列,图像画在从左到右从上到下的第1块

# np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
# start:开始,stop:终止,num:间隔等差,一共有50个元素,endpoint=True是包括stop的位置的
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False) #0到360度划分有50个数量的间隔(生成一维顺序的数组值。)
# print(theta)
radii = np.linspace(35, 120, N, endpoint=False)  #30到120划分有50个数量的间隔
print(radii)
theta=theta[::-1]  #倒序输出一维数组值,并且赋值自身。
print(theta)
width = np.pi*2/N  #计算每一份圆心角的大小
colors = plt.cm.hsv((radii-radii[0])/(radii[N-1]-radii[0])) #设置绘图颜色的函数
colors=colors[::-1]  
colors=colors[:,[0,1,2,3]]

ax = plt.subplot(111, projection='polar') # 第一个参数:三个整数是行数、列数和索引值 第二个参数:设置为极坐标
ax.grid(False)  #没有网格线
ax.set_xticks([]) #x斜着显示
ax.set_yticks([])  #y斜着显示
ax.spines['polar'].set_visible(False) #获取极坐标轴,并且将坐标轴隐藏。
ax.set_theta_zero_location("N",offset=5) # 方法用于设置极坐标0°位置,设置扇形偏离位置。
ax.bar(theta, radii, #角度对应位置,半径对应高度。
       width=width,  #宽度
       bottom=0.0,   #远离圆心,设置偏离距离
       color=colors)

ax.fill(theta, [8]*N, color="w") 
tempdata=dat[:N]   #遍历dat列表数据,存放到tempdata中
tempdata=tempdata[::-1] #倒序遍历tempdata数据,将原来降序,排成升序。
split=23
rotations=np.linspace(90,-270,N, endpoint=False)
for i in range(N-split):
    ax.text(theta[i]-0.02,radii[i]+11,tempdata[i]["nation"]+"\n"+str(tempdata[i]["confirmed"])+'例',rotation=rotations[i],ha="center"
            ,fontsize=20)
for i in range(N-split,N):
    ax.text(theta[i],radii[i]-11,tempdata[i]["nation"]+"\n"+str(tempdata[i]["confirmed"])+'例',ha="center"
            ,fontsize=16,color="black",fontstyle='normal',fontweight='black',)
plt.title("全球新冠肺炎疫情",fontsize="99",horizontalalignment="right",color="black")


cell_width = 212  
cell_height = 22
swatch_width= -232
axes_kwargs={"fc":"#000000"}
axins1=inset_axes(ax,width=39*0.18, height=35*0.16, loc=1)
n = len(dat)-N-100
ncols = 2
nrows = n // ncols + int(n % ncols > 0)
# dat=dat[N:]
labeldata=dat[N:]
axins1.set_xlim(0,cell_width*2)
axins1.set_ylim(cell_height* (nrows-0.5),-cell_height/2.)
axins1.yaxis.set_visible(False)
axins1.xaxis.set_visible(False)
axins1.set_axis_off()
ax
for i in range(n):
    
     row = i % nrows
     col = i // nrows
     y = row * cell_height
     swatch_start_x = cell_width * col
     swatch_end_x = cell_width * col + swatch_width
     text_pos_x = cell_width * col + swatch_width + 10
     axins1.text(text_pos_x-35, y, str(labeldata[i]["confirmed"]), fontsize=15,
                horizontalalignment='left',
                verticalalignment='center',
                backgroundcolor="hotpink")
     axins1.text(text_pos_x, y, labeldata[i]["nation"], fontsize=15,
                horizontalalignment='left',
                verticalalignment='center')
     
plt.savefig("D://ex2.png")
plt.show()

运行结果:
在这里插入图片描述

模范作业的代码:
数据集下载地址https://download.csdn.net/download/aiboom/13115610

import pandas as pd
from pyecharts.charts import Pie,Grid,TreeMap
from pyecharts import options as opts

# 导入输出图片工具
#from pyecharts.render import make_snapshot
# 使用snapshot-selenium 渲染图片
#from snapshot_selenium import snapshot

data = pd.read_csv("D:\Homework\上课课件\大数据审计\data\data.csv")
#print(data['Country/Region']['confirmed'])
data.sort_values(by='confirmed',ascending=False,inplace=True)
#确诊人数超过35万的国家和地区
rank = data[data['confirmed']>350000]
#确诊人数少于35万的国家和地区
subdata = data[data['confirmed']<350000]
v = rank['Country/Region'].values.tolist()
d = rank['confirmed'].values.tolist()
pie = (Pie(init_opts=opts.InitOpts(width='1350px',height='750px',theme= "white",bg_color='white'))
       .add(
                "",[list(z) for z in zip(v,d)],
                radius = ["30%", "135%"],  # 设置内半径和外半径
                center = ["50%", "75%"],  # 设置圆心位置
                is_clockwise = False,
                rosetype = "area"
                )   # 玫瑰图模式,通过半径区分数值大小,角度大小表示占比
       .set_global_opts(title_opts = opts.TitleOpts(title="全球新冠肺炎疫情\n截至北京时间11月6日上午8时全球189个国家和地区\n现有确诊49322827例",  # 设置图标题
                                                subtitle ='''沙特阿拉伯  349822例         巴基斯坦  341753例       以色列  318402例        罗马尼亚  287062例       加拿大  258874例
摩洛哥         246349例         瑞士         211913例      尼泊尔  188883例        厄瓜多尔  172508例       葡萄牙  166900例
瑞典            146461例        玻利维亚    142343例      阿联酋  139891例          奥地利  138979例        巴拿马  137760例
卡塔尔         133811例         科威特    130463例      多米你加  129300例       阿曼  117167例       哈萨克斯坦  115439例
哥斯达黎加   115417例         危地马拉  110502例         埃及  108754例         日本  106136例         白俄罗斯  104286例
亚美尼亚   101773例           约旦    101248例             匈牙利   99625例       洪都拉斯   99576例   埃塞俄比亚   98746例
委内瑞拉     94305例           中国      92164例            黎巴嫩   91328例        巴林      83023例         摩尔多瓦   80501例
保加利亚     72184例           斯洛伐克   71088例   乌兹别克斯坦   68139例     巴拉圭   66481例          利比亚   66444例
突尼斯       66334例            爱尔兰   64538例           尼日利亚   63731例      阿塞拜疆   62338例      克罗地亚   62305例
吉尔吉斯斯坦 61748例     阿尔及利亚   60800例          肯尼亚   60704例          波黑      59427例            缅甸   59277例
新加坡        58047例        塞尔维亚   57958例           巴勒斯坦   57226例        丹麦      53692例             希腊   52254例
格鲁吉亚      51993例       加纳   48788例            斯洛文尼亚   42658例          阿富汗   41975例      马来西亚   38189例
北马其顿     37499例       萨尔瓦多   34966例         澳大利亚   27652例            韩国   27284例           挪威     23835例
阿尔巴尼亚   23210例          科索沃   22934例             喀麦隆   22103例           黑山   22079例         卢森堡   21806例
科特迪瓦     20801例          立陶宛   20747例            芬兰       17385例       马达加斯加    17111例      赞比亚   16819例
塞内加尔     15676例         苏丹   13943例            乌干达   13852例            莫桑比克   13485例       纳米比亚   13143例
斯里兰卡     12970例        几内亚   12363例            安哥拉   12223例        马尔代夫   11932例     刚果(金)   11517例
塔吉克斯坦   11256例       牙买加    9426例               佛得角    9224例             海地        9127例           加蓬      9022例
津巴布韦      8471例         博茨瓦纳    7835例       毛利塔尼亚    7804例          拉脱维亚    7476例          古巴    7228例
马耳他        6893例            巴哈马    6882例          叙利亚    6102例        斯威士兰王国    5976例         马拉维    5942例
特立尼达和多巴哥 5798例      爱沙尼亚    5705例          吉布提    5604例    尼加拉瓜       5591例       塞浦路斯    5557例
刚果(布)     5379例          苏里南    5227例            卢旺达     5208例        安道尔     5135例      赤道几内亚    5092例
冰岛           5039例           开曼群岛    4866例          圭亚那      4457例          索马里      4229例          伯利兹     4016例
泰国           3830例   冈比亚    3684例    马里    3657例         乌拉圭    3370例    南乔治亚岛和南桑德韦奇岛    2943例
贝宁          2745例         布基纳法索    2562例             多哥    2460例         几内亚比绍    2414例      塞拉利昂    2373例
也门          2067例           新西兰    1976例          莱索托    1967例                乍得      1538例            利比里亚    1442例
尼日尔        1230例         越南    1212例         圣马力诺    1043例  圣多美和普林西比     960例       列支敦士登     741例
钻石公主号     712例      布隆迪     606例        巴布亚新几内亚     597例            科摩罗     557例        坦桑尼亚     509例
                        厄立特里亚   484例    摩纳哥     454例     毛里求斯     453例       不丹        358例             蒙古     357例
                        柬埔寨        294例 巴巴多斯     242例  塞舌尔   158例   英属印度洋领地  148例 安提瓜和巴布达   130例
                        卢西亚       110例 圣文森特和格林纳丁斯      76例 多米尼克      57例    斐济      34例      东帝汶      30例
                        格林纳达      30例 梵蒂冈      27例 老挝      24例      圣基茨和尼维斯      19例         所罗门群岛      13例
                                    西撒哈拉      10例           赞丹号       9例          马绍尔群岛       1例''',
                                                #printData(sub) ,
                                                pos_right = '30%', # 图标题的位置
                                                #pos_bottom= 'center',
                                                pos_left= '52%',
                                                pos_top= '1%',
                                                title_textstyle_opts=opts.TextStyleOpts(font_size='20'),
                                                subtitle_textstyle_opts=opts.TextStyleOpts(font_size='12',padding=[2,2,2,2])
                                                ), 
                        legend_opts = opts.LegendOpts( # 设置图例
                                                orient='vertical', # 垂直放置图例
                                                pos_left="20%", # 设置图例位置
                                                pos_top="15%"
                                                ),
                        toolbox_opts = opts.ToolboxOpts()
                        )
       .set_series_opts(label_opts = opts.LabelOpts(formatter="{b} \n {c}例", position='inside',
                                                font_size=12, font_style="italic",font_weight="bold", font_family="Microsoft YaHei"),
                    )
       )
pie.render('全球疫情图.html')
# 输出保存为图片
#make_snapshot(snapshot, pie.render(), "全球疫情图.png")




运行结果:

在这里插入图片描述


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值