本设计设计到numpy库、pandas库、matplotlib库、sklearn库、以及文件存取的具体应用.可移植性强、界面美观、初具小型系统雏形,是一份结合数据分析、数据可视化与机器学习学习的课程设计。希望读者喜欢~
本课程设计项目特色在于:
(1)精心配色,可视化效果更佳。
(2)多文件结构,文件之间的层次更加清晰。
(3)路径地址采用相对路径,可移植性高。
(4)增加了主菜单,方便选择调用需要执行的功能。
(5)对风向雷达图贴上了八个方向的标签,并且使用不同的随机颜色对八个方向进行着色,方便区分。
(6)增加动态效果,对“XX变化图”增加了运行时动态生成的效果,对“变化”的感知将更加深刻,具体原理见chart.py文件。
(7)对温度与相对湿度的相关性分析增加了求解皮尔逊相关系数(定义了一个coefficient函数求解)和求解温度-相对湿度两个变量之间的线性回归方程(利用机器学习库sklearn中的LinearRegression求解),并将相关系数和拟合曲线展示。
2022.06.09上新C++的课程设计:C++课程设计歌唱比赛歌手评分系统1500行代码含技术设计文档 欢迎感兴趣的朋友交流与学习~
基于有一些阅读者想与笔者有交流与合作,贴一下本人的微信:StarsForMoon
,添加请说明来意(如CSDN)。如果觉得做得还不错的话,考虑到笔者暂时还不能用爱发电,整个项目打包(含数据集、源码、PPT)+ 任意一处源码答疑可联系微信,20R即可。感谢你对笔者的支持!
需要数据集请直接添加上面的微信!CSDN上不方便发送,谢谢配合:)
说明:
① dataset文件夹:存放天气数据的csv文件。
② main.py:调用dataset中的数据和src中的源代码,得出可视化图片,然后保存于result文件夹,它是程序运行入口。
③ result文件夹:存放运行完成后的可视化图片。
④ src文件夹:存放数据分析与可视化的源代码。
⑤ 执行main.py后,XX变化图的可视化将会是一个动态变化图展示,所有保存的可视化图片都是静态的.png图片。
(1)main.py源代码:
#main.py是启动程序,负责启动和调用相应的功能,并导入数据集
def main():
#数据分析与可视化实现
key=1
print("\n请选择你所需要的分析: \n0、温度变化图\n1、相对湿度变化图\n2、温度与相对湿度分析图\n3、降雨量变化图\n4、风向雷达图")
#多功能数据分析与可视化的选择
#try-except结构避免用户输入不正确或恶意输入
while 1:
try:
i=int(input('输入需要查看的图表(输入-1退出):'))
break
except:
print("输入有误,请重新输入")
print("\n请选择你所需要的分析: \n0、温度变化图\n1、相对湿度变化图\n2、温度与相对湿度分析图\n3、降雨量变化图\n4、风向雷达图")
#选择对应功能后,调用对应函数
#while循环实现多次查看不同的功能
while key==1:
if(i==-1):
key=0
break
while i!=-1:
if i==0:
dataprocess.temperature(data)#温度变化曲线
break
elif i==1:
dataprocess.humidity(data)#湿度变化曲线
break
elif i==2:
dataprocess.relevance(data)#温湿度相关性分析
break
elif i==3:
dataprocess.rainfall(data)#降雨量曲线图
break
elif i==4:
dataprocess.wind(data)#风级风向雷达图
break
elif i==-1:
key=0
print("正在退出......")
break
else:
print("输入有误请重新输入")
break
if(key==0):
break
print("\n请选择你所需要的分析: \n0、温度变化图\n1、相对湿度变化图\n2、温度与相对湿度分析图\n3、降雨量变化图\n4、风向雷达图")
i = int(input('输入需要查看的图表(输入-1退出):'))
print("\n退出成功,欢迎下次使用!")
#启动入口
if __name__=="__main__":
main()
(2)dataset文件夹内部:
存有一个天气数据的csv文件,通过爬虫代码获取自己地区当前天气数据。
(3)src文件夹内部:
内有两个.py文件,dataprocess.py是数据分析处理文件,chart.py是数据可视化文件,main函数会先调用处理文件后再可视化文件。
(4)dataprocess.py代码(使用Numpy、Pandas进行数据处理的文件,此处就不展示了):
dataprocess.py程序是数据处理程序
负责对来自对数据集进行数据分析和处理,以便于提供给chart.py程序进行可视化
(5)chart.py源代码:
chart.py程序是调用matplotlib中的库函数进行可视化
数据的接收自dataprocess.py程序,然后进行可视化
分别有温度变化折线图、相对湿度变化折线图、降水量变化柱状图、风向雷达图、以及结合机器学习线性回归生成的温湿度相关性分析图。
特色:运行过程中,所有变化图都会动态生成,非常酷炫!
#温度变化图
def temdiagram(tems,hours,temave,temmin,tem_minhour,temmax,tem_maxhour):
x = []#以时间为x坐标
y = []#以温度为y坐标
plt.figure(1,figsize=(16,10))#定义图片大小和序号
#制作数据变化的动画效果
for i in range(0, 24):
x.append(i)
y.append(tems[hours.index(i)]) # 每迭代一次,将i放入y中画出来
plt.clf() # 清除键
plt.plot(x, y, color='#7FFFD4', label='温度')
plt.legend()
plt.pause(0.15)#暂停0.15s便可以得到动画效果
#定义图片标题,x轴和y轴坐标名称
plt.title('重庆市主城区一天温度变化曲线图')
plt.xlabel('时间/h')
plt.ylabel('摄氏度/℃')
plt.scatter(x, y, color='#7FFFD4') # 点出每个时刻的温度点
# 画出平均温度虚线
plt.plot([0, 24], [temave, temave], color='#5595F9', linestyle='--', label='平均温度')
plt.text(tem_maxhour + 0.15, temmax - 0.25, str(temmax) + '℃', ha='center', va='bottom', fontsize=10.5,
color='#9370DB') # 标出最高温度
plt.text(tem_minhour + 0.15, temmin - 0.20, str(temmin) + '℃', ha='center', va='bottom', fontsize=10.5,
color='#9370DB') # 标出最低温度
plt.xticks(x)
plt.savefig(savepath+'\温度变化图.png', dpi=800)#保存图片到指定文件夹
plt.show()
plt.close()
#相对湿度变化图
def humdiagram(hours,hums,humave,hummax,hum_maxhour,hummin,hum_minhour):
x = []#时间为x坐标
y = []#湿度为y坐标
plt.figure(2, figsize=(16, 10))#定义图片大小和序号
#制作数据变化的动画效果
for i in range(0, 24):
x.append(i)
y.append(hums[hours.index(i)]) # 每迭代一次,将i放入y中画出来
plt.cla() # 清除键
plt.plot(x, y, color='#7FFFD4', label='相对湿度') # 相对湿度曲线
plt.legend()
plt.pause(0.15)#暂停0.15s便可以得到动画效果
#定义图片标题,x轴和y轴坐标名称
plt.title('重庆市主城区一天相对湿度变化曲线图')
plt.xlabel('时间/h')
plt.ylabel('百分比/%')
plt.scatter(x, y, color='#7FFFD4') # 点出每个时刻的相对湿度
# 画出平均相对湿度虚线
plt.plot([0, 24], [humave, humave], color='#5595F9', linestyle='--', label='平均相对湿度')
plt.text(hum_maxhour + 0.15, hummax + 0.15, str(hummax) + '%', ha='center', va='bottom', fontsize=10.5,
color='#9370DB') # 标出最高相对湿度
plt.text(hum_minhour + 0.15, hummin - 0.95, str(hummin) + '%', ha='center', va='bottom', fontsize=10.5,
color='#9370DB') # 标出最低相对湿度
plt.xticks(x)
plt.savefig(savepath+'\相对湿度变化图.png', dpi=800)#保存图片到指定文件夹
plt.show()
plt.close()
#降雨量曲线图
def rainfalldiagram(hours,rainfall,rainfallavg,rainfallmax,hour_rainfallmax,rainfallmin,hour_rainfallmin):
x = []#时间为x坐标
y = []#降雨量为y坐标
plt.figure(3, figsize=(16, 10))#定义图片大小和序号
#制作数据变化的动画效果
for i in range(0, 24):
x.append(i)
y.append(rainfall[hours.index(i)]) # 每迭代一次,将i放入y中画出来
plt.cla() # 清除键
plt.bar(x, y, color='#7FFFD4', width=0.7,label='降水量')
plt.legend()
plt.pause(0.15)#暂停0.15s便可以得到动画效果
#定义图片标题,x轴和y轴坐标名称
plt.title('重庆市主城区一天降水量变化柱状图')
plt.xlabel('时间/h')
plt.ylabel('降水量/mm')
# 画出平均降水量虚线
plt.plot([0, 24], [rainfallavg, rainfallavg], color='#5595F9', linestyle='--', label='平均降水量')
plt.text(hour_rainfallmax, rainfallmax + 0.01, str(rainfallmax) + 'mm', ha='center', va='bottom', fontsize=10.5,
color='#9370DB') # 标出最高降水量
plt.text(hour_rainfallmin, rainfallmin + 0.01, str(rainfallmin) + 'mm', ha='center', va='bottom', fontsize=10.5,
color='#9370DB') # 标出最低降水量
plt.xticks(x)
plt.savefig(savepath+'\降水量变化图.png', dpi=800)#保存图片到指定文件夹
plt.show()
plt.close()
#风向雷达图
def windradar(temp):
plt.figure(4, figsize=(16, 10))#定义图片大小和序号
N = 8 #定义分为八个方向
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)#将0-2pi分为8块
radii = np.array(temp)#半径为该方向的平均风级大小
width = np.pi / 4 #每一块为pi/4大小
colors = plt.cm.viridis(np.random.rand(N))#随机八块的颜色
labels=['东风','东北风','北风','西北风','西风','西南风','南风','东南风']#用于对八块进行贴标签
plt.subplot(projection='polar')
#定义图片标题
plt.title('重庆市主城区一天风级图')
plt.bar(theta, radii, width=width, color=colors,alpha=0.3, bottom=0.0)#绘制极坐标图
#对每一块贴上对应的标签
for angle,radius,label in zip(theta,radii,labels):
plt.text(angle,radius,label,ha='center',va='bottom',fontsize=14.5,color='black')
plt.savefig(savepath+'\风向雷达图.png', dpi=800)#保存图片到指定文件夹
plt.show()
plt.close()
风向雷达图
#皮尔逊相关系数函数
def coefficient(var1,var2):
aavg = sum(var1)/len(var1)#变量1的平均值
bavg = sum(var2)/len(var2)#变量2的平均值
covab = sum([(x - aavg)*(y - bavg) for x,y in zip(var1,var2)])#变量1和变量2的协方差
asd= math.sqrt(sum([(i - aavg)**2 for i in var1]))#变量1的标准差
bsd= math.sqrt(sum([(j - bavg)**2 for j in var2]))#变量2的标准差
raletive_coe = covab/(asd*bsd) #变量1和2的皮尔逊相关系数
return round(raletive_coe,4)
#温湿度相关性分析
def relevancediagram(tems,hums,x,w,b,f):
plt.figure(5, figsize=(16, 10))#定义图片大小和序号
#定义图片标题,x轴和y轴坐标名称
plt.title("温湿度相关性分析图")
plt.xlabel("温度/℃")
plt.ylabel("相对湿度/%")
plt.scatter(tems, hums, color='#7FFFD4')#绘制散点图
plt.plot(x, f)#绘制线性回归拟合曲线
#标出线性回归方程和皮尔逊相关系数
plt.text(20.1, 95.0, '线性回归方程:\nY=' + str(round(w, 3)) + 'X+' + str(round(b, 3)),
fontdict={'size': '10', 'color': '#02082D'})
if (coefficient(tems, hums) < 0):
plt.text(20, 77.5, "相关系数为:" + str(coefficient(tems, hums)) + ',温湿度线性负相关',
fontdict={'size': '15', 'color': '#5595F9'})
elif (coefficient(tems, hums) == 0):
plt.text(20, 77.5, "相关系数为:" + str(coefficient(tems, hums)) + ',温湿度不存在线性相关',
fontdict={'size': '15', 'color': '#5595F9'})
elif (coefficient(tems, hums) > 0):
plt.text(20, 77.5, "相关系数为:" + str(coefficient(tems, hums)) + ',温湿度线性正相关',
fontdict={'size': '15', 'color': '#5595F9'})
plt.savefig(savepath+'\温湿度相关性分析图.png', dpi=800)#保存图片到指定文件夹
plt.show()
plt.close()
StarsForMoon