一个废物大学生的学习日常day1(10月23日)(折线图与地图的绘制

发布于:2022-10-23 ⋅ 阅读:(424) ⋅ 点赞:(0)

       本人目前还是一在校大二学生,对未来感到十分迷茫,但又不愿意一直躺平,于是就写博客来纪录一下每天的学习日常。我也不知道能写多久,但写一天算一天吧。欢迎大家一起打卡交流。

目录

一.python方面的学习

1.运用pyecharts模块制作简单折线图

2.运用pyecharts模块制作全国疫情地图

二.数据结构方面的学习

1.归并排序的递归实现方式

2.归并排序的非递归实现方式


一.python方面的学习

        其实在大一的时候已经学过python了,但是学的很浅,最近学校工作室招新,想补一下python然后去面试工作室。

        今天学习了简单的运用pyecharts模块

        pyecharts模块的介绍: http://pyecharts.org

1.运用pyecharts模块制作简单折线图

           过程:从文件中取出数据->在懒人工具中处理数据->导入模块->传入数据->绘图

  简单解释绘制折线图的操作 

from pyecharts.charts import Line #我们要制作的是一个折线图

line = Line()

line.add_xaxis()#传入折线图的X坐标的数据
line.add_yaxis()#传入折线图的y坐标的数据

line.set_global_opts()#修改折线图的全局配置项

line.render()#导出一个html文件
import json
from pyecharts.charts import Line
from pyecharts.options import TitleOpts,LabelOpts
#从文件中读取数据
f_us = open("E:\美国.txt","r",encoding="UTF-8")
f_jp = open("E:\日本.txt","r",encoding="UTF-8")
f_in = open("E:\印度.txt","r",encoding="UTF-8")
us_data = f_us.read()
jp_data = f_jp.read()
in_data = f_in.read()
#处理数据
us_data = us_data.replace("jsonp_1629344292311_69436(","")
jp_data = jp_data.replace("jsonp_1629350871167_29498(","")
in_data = in_data.replace("jsonp_1629350745930_63180(","")
us_data = us_data[:-2]
jp_data = jp_data[:-2]
in_data = in_data[:-2]
us_dict = json.loads(us_data)
jp_dict = json.loads(jp_data)
in_dict = json.loads(in_data)
us_trend_data = us_dict['data'][0]['trend']
jp_trend_data = jp_dict['data'][0]['trend']
in_trend_data = in_dict['data'][0]['trend']
us_x_data = us_trend_data['updateDate'][:314]
jp_x_data = jp_trend_data['updateDate'][:314]
in_x_data = in_trend_data['updateDate'][:314]
us_y_data = us_trend_data['list'][0]['data'][:314]
jp_y_data = jp_trend_data['list'][0]['data'][:314]
in_y_data = in_trend_data['list'][0]['data'][:314]
#传入数据
line = Line()
line.add_xaxis(us_x_data)
line.add_yaxis("美国确诊人数",us_y_data,label_opts=LabelOpts(is_show=False))
line.add_yaxis("日本确诊人数",jp_y_data,label_opts=LabelOpts(is_show=False))
line.add_yaxis("印度确诊人数",in_y_data,label_opts=LabelOpts(is_show=False))
#绘图
line.set_global_opts(
    title_opts=TitleOpts(title="2020年美日印三国确诊人数折线图",pos_left="center",pos_bottom="1%")

)
line.render()
f_us.close()
f_jp.close()
f_in.close()

 简单解释上述代码

line.set_global_opts(
    title_opts=TitleOpts(title="2020年美日印三国确诊人数折线图",pos_left="center",pos_bottom="1%")

)

"""想修改line的全局配置必须通过 from pyecharts.options import * 来导入模块,这里我们通过import * 直接全部导入"""
"""几种常见的全局配置项;
    TitleOpts:标题配置项
    LegendOpts:图例配置项
    VisualMapOpts:视觉映射配置项
    ToolboxOpts:工具箱配置项
    TooltipOpts:提示框配置项"""
"""pos_left:可以控制标题距离左边的位置
   pos_bottom:可以控制标题距离底部的位置"""
line.add_yaxis("美国确诊人数",us_y_data,label_opts=LabelOpts(is_show=False))
"""label_opts=LabelOpts(is_show=False) 可以让节点上的数字不显示,鼠标放上去了之后才显示
"""

 效果图

2.运用pyecharts模块制作全国疫情地图

简单解释绘制地图的操作

from pyecharts.charts import Map #依旧是导入模块
map = Map()
map.add()#传入数据
map.set_global_opts()#修改图的全局配置
map.render()#导出一个html文件
import json
from pyecharts.charts import Map
from pyecharts.options import *

f = open("E:/疫情.txt","r",encoding="UTF-8")
data = f.read()
f.close()
data_dict = json.loads(data)
province_data_list =  data_dict["areaTree"][0]["children"]
data_list = []
for province_data in province_data_list:
    province_name = province_data["name"]
    province_confirm = province_data["total"]["confirm"]
    data_list.append((province_name,province_confirm))
map = Map()
map.add("各省份确诊人数",data_list,"china")
map.set_global_opts(
    title_opts=TitleOpts(title="全国疫情地图"),
    visualmap_opts=VisualMapOpts(
        is_show=True,
        is_piecewise=True,
        pieces=[
            {"min":1,"max":99,"label":"1~99人","color":"#CCFFFF"},
            {"min":100,"max":999,"label":"100~999人","color":"#FFFF99"},
            {"min":1000,"max":4999,"label":"1000~4999人","color":"#FF9966"},
            {"min":5000,"max":9999,"label":"5000~9999人","color":"#FF6666"},
            {"min":10000,"max":99999,"label":"10000~99999人","color":"#CC3333"},
            {"min":100000,"label":"100000+","color":"#990033"}
        ]
    )
)
map.render()

简单解释上述代码

map.add("各省份确诊人数",data_list,"china")
#data_list传进去的是一个列表,列表里面的内容是一个个元组,"china"不写的话默认是"china"
map.set_global_opts(
    title_opts=TitleOpts(title="全国疫情地图"),#修改标题
    visualmap_opts=VisualMapOpts(
        is_show=True,#显示
        is_piecewise=True,
        pieces=[
            {"min":1,"max":99,"label":"1~99人","color":"#CCFFFF"},
            {"min":100,"max":999,"label":"100~999人","color":"#FFFF99"},
            {"min":1000,"max":4999,"label":"1000~4999人","color":"#FF9966"},
            {"min":5000,"max":9999,"label":"5000~9999人","color":"#FF6666"},
            {"min":10000,"max":99999,"label":"10000~99999人","color":"#CC3333"},
            {"min":100000,"label":"100000+","color":"#990033"}
        ]
    )
)
visualmap_opts=VisualMapOpts()#修改视觉映射
is_piecewise#分段显示
pieces=[
            {"min":1,"max":99,"label":"1~99人","color":"#CCFFFF"},
            {"min":100,"max":999,"label":"100~999人","color":"#FFFF99"},
            {"min":1000,"max":4999,"label":"1000~4999人","color":"#FF9966"},
            {"min":5000,"max":9999,"label":"5000~9999人","color":"#FF6666"},
            {"min":10000,"max":99999,"label":"10000~99999人","color":"#CC3333"},
            {"min":100000,"label":"100000+","color":"#990033"}
        ]
#因为默认区间是0~100,我们这里的数据已经超过了100,所以需要用 pieces=[{}] 来进行手动分段
#pieces本身是一个列表,里面的元素类型是字典
    

 效果展示

 自制了一个四川疫情图(嗯~怎么不算应用呢)

import json
from pyecharts.charts import Map
from pyecharts.options import *


f = open("E:/疫情.txt","r",encoding="UTF-8")
data = f.read()
f.close()

data_dict = json.loads(data)
sichuan_data_list = data_dict["areaTree"][0]["children"][12]["children"]
data_list = []
data_list.append(("阿坝藏族羌族自治州",1))
data_list.append(("甘孜藏族自治州",78))
data_list.append(("凉山彝族自治州",13))
for sichuan_data in sichuan_data_list:
    sichuan_name = sichuan_data["name"] + '市'
    sichuan_confirm = sichuan_data["total"]["confirm"]
    data_list.append((sichuan_name,sichuan_confirm))
print(data_list)
map = Map()
map.add("四川各市区确诊人数",data_list,"四川")
map.set_global_opts(
    title_opts=TitleOpts(title="四川疫情地图"),
    visualmap_opts=VisualMapOpts(
        is_show=True,
        is_piecewise=True,
        pieces=[
            {"min": 1, "max": 99, "label": "1~99人", "color": "#CCFFFF"},
            {"min": 100, "max": 999, "label": "100~999人", "color": "#FFFF99"},
            {"min": 1000, "max": 4999, "label": "1000~4999人", "color": "#FF9966"},
            {"min": 5000, "max": 9999, "label": "5000~9999人", "color": "#FF6666"}
        ]
    )
)
map.render()

 效果展示

二.数据结构方面的学习

1.归并排序的递归实现方式

归并排序   时间复杂度: O(n*logn)  空间复杂度: O(n)

        

void _MergeSort(int* a, int left, int right, int* tmp) {
	//建立一个子函数,用来进行归并过程
	if (left >= right) {
		return;
	}
	int mid = (left + right) >> 1;
	//假设[left, mid - 1] [mid + 1, right] 有序,那么就可以归并了
	//如果没有序,那么继续划分
	_MergeSort(a, left, mid, tmp);
	_MergeSort(a, mid + 1, right, tmp);
	//开始归并
	int begin1 = left, end1 = mid;
	int begin2 = mid + 1, end2 = right;
	int index = left;
	while (begin1 <= end1 && begin2 <= end2) {
		if (a[begin1] < a[begin2]) {
			//将小的数放在临时数组的index位置上
			tmp[index++] = a[begin1++];
		}
		else {
			tmp[index++] = a[begin2++];
		}
	}
	//当有一边结束的时候,把另一边的数放进临时数组
	while (begin1 <= end1) {
		tmp[index++] = a[begin1++];
	}
	while (begin2 <= end2) {
		tmp[index++] = a[begin2++];
	}
	//再将临时数组的值拷进原数组
	for (int j = left; j <= right; ++j) {
		a[j] = tmp[j];
	}
}

void MergeSort(int* a, int n) {
	int* tmp = (int*)malloc(sizeof(int) * n);//归并有空间复杂度的消耗
	_MergeSort(a, 0, n - 1, tmp);
	free(tmp);
}

2.归并排序的非递归实现方式

  

 

void MergeSortNR(int* a, int n) {
	int* tmp = (int*)malloc(sizeof(int) * n);//归并有空间复杂度的消耗
	int gap = 1;//每组数据个数
	while (gap < n) {
		for (int i = 0; i < n; i += gap * 2) {
			//[i, i + gap - 1] [i + gap. i + 2 * gap - 1]
			int begin1 = i, end1 = i + gap - 1;
			int begin2 = i + gap, end2 = i + 2 * gap - 1;
			//归并过程中右半区间可能不存在
			if (begin2 >= n) {
				break;
			}
			//归并过程中右半区间算多了,需要修正end2
			if (end2 >= n) {
				end2 = n - 1;
			}
			int index = i;
			while (begin1 <= end1 && begin2 <= end2) {
				if (a[begin1] < a[begin2]) {
					//将小的数放在临时数组的index位置上
					tmp[index++] = a[begin1++];
				}
				else {
					tmp[index++] = a[begin2++];
				}
			}
			//当有一边结束的时候,把另一边的数放进临时数组
			while (begin1 <= end1) {
				tmp[index++] = a[begin1++];
			}
			while (begin2 <= end2) {
				tmp[index++] = a[begin2++];
			}
			//再将临时数组的值拷进原数组
			for (int j = i; j <= end2; ++j) {
				a[j] = tmp[j];
			}
		}
		gap *= 2;
	}
	free(tmp);
}

       为什么不用栈和队列去模拟实现非递归呢,因为用栈和队列去存区间会有空间的消耗,而用循环去写就不需要。

        这是我人生中写的第一篇博客,只是为了纪录一下学习过程,感觉学到知识后再写一遍忘得会比较慢,以后也能想看就看