当前位置:   article > 正文

2024美赛E题总结——数据可视化篇1——地图

2024美赛E题总结——数据可视化篇1——地图

        “数据可视化”在美赛的论文中至关重要 ,这个方面做的好的论文往往都有加分。关于这方向能力的提高,笔者雨洛建议是学习美赛O奖论文,看看他们使用哪种形式来表现数据,然后从中学习你认为能清楚表达数据且比较优美的图,准备好相关的代码或者记住对应的画图方法。


        下面列出一下E题O奖中常见的图的画法:

一.地图形式

2023年E题O奖论文截图

因为E题往往和地区有关,不论是22的森林,23的光污染,还是今年的自然灾害与保险,都是与地区有关,所以这种将数据用地图形式的热力图来表达的方法在E题中经常出现。画这种图用Python画还是挺简单的。

1.第一种方法:直接用Python库pyecharts.charts

这种画法比较简单,但是也有限制,图例的位置基本无法改变(或者可以改变但是我不会),其主要原理是我们所用的地区名称与Python库所含有的地区名称相匹配,然后将数据标在地图对应的位置上,所以csv文件中的要显示的地区的名称要正确,如果不确定可以先运行下面提供的代码(以世界地图为例),就可以找到对应的国家名字了,如果想要某个国家的地名可以将world_map.py中的world改成对应的国家就可以了。

(1)第一步:得到.csv文件

        一般我们的得到的数据是Excel文件,我们需要将Excel形式的文件转化为.csv文件,如果已经是.csv文件就可以跳过这一步,直接运行第二步的代码代码如下

Excel_to_csv.py:
第一种生成在默认目录:
  1. import pandas as pd
  2. File_name = 'D:\python\py_project\ICM\excel_data.xlsx'
  3. df = pd.read_excel(File_name) # 读取Excel表格中的数据
  4. df.to_csv("csv_data3.csv", index=False) # 将 DataFrame 保存为 CSV 文件
第二种生成在指定的目录下:
  1. import pandas as pd
  2. # 指定 Excel 文件路径
  3. file_name = 'D:\python\py_project\ICM\excel_data.xlsx'
  4. df = pd.read_excel(file_name) # 读取 Excel 表格中的数据
  5. output_file_path = 'D:\python\py_project\ICM\csv_data3.csv' # 指定输出 CSV 文件路径(包括目录)
  6. df.to_csv(output_file_path, index=False) # 将 DataFrame 保存为 CSV 文件
运行结果 :

to_csv.py(将对应的列转换为csv文件):
  1. # author:林鸿炜
  2. # date:2024/2/12
  3. import pandas as pd
  4. # 提供的数据
  5. data_str = """
  6. entity average rainfall (pre) mm/year
  7. United States 0.091962617
  8. China 0.111028037
  9. India 0.321715232
  10. Brazil 0.340582739
  11. Russia 0.13464541
  12. Germany 0.13260033
  13. United Kingdom 0.152985159
  14. France 0.168180317
  15. Japan 0.372160528
  16. Canada 0.08420011
  17. Australia 0.059681143
  18. South Africa 0.115448047
  19. Mexico 0.079604178
  20. South Korea 0.276525565
  21. Indonesia 1
  22. """
  23. # 将数据解析成列表形式
  24. data_list = [line.split("\t") for line in data_str.strip().split("\n")]
  25. # 将列表转换为 DataFrame
  26. df = pd.DataFrame(data_list[1:], columns=data_list[0])
  27. # 将 DataFrame 保存为 Excel 文件
  28. # df.to_excel("excel_data.xlsx", index=False)
  29. df.to_csv("csv_data.csv", index=False)
运行结果:

(2)运行画图代码world_map.py:

  1. from pyecharts import options as opts
  2. import pandas as pd
  3. from pyecharts.charts import Map
  4. import os
  5. # 基础数据
  6. data = pd.read_csv('entity_scores.csv')
  7. A = data['Entity'].to_list()
  8. B = data['Score'].to_list()
  9. attr = A
  10. value = B
  11. data = []
  12. for index in range(len(attr)):
  13. city_info = [attr[index], value[index]]
  14. data.append(city_info)
  15. # 为没有数据的地方添加斜线图案
  16. for country in list(set(attr)): # Assuming 'attr' contains the list of countries/entities
  17. if country not in attr:
  18. data.append([country, None])
  19. c = (
  20. Map()
  21. .add("", data, "world", is_map_symbol_show=False) # Turn off map symbols世界地图
  22. .set_series_opts(
  23. label_opts=opts.LabelOpts(is_show=False),
  24. itemstyle_opts={
  25. "normal": {"areaColor": "#EFF1F3", "borderColor": "#404a59"},
  26. "emphasis": {"label": {"show": True, "color": "white"}},
  27. },
  28. )
  29. .set_global_opts(
  30. title_opts=opts.TitleOpts(
  31. title="Natural Disaster Risk Level",
  32. pos_bottom='bottom' , # 设置标题文本在标题框中的底部
  33. pos_left='center' # Adjust title position to the center
  34. ), # subtitle="Entity Scores"
  35. visualmap_opts=opts.VisualMapOpts(
  36. max_=max(value),
  37. min_=min(value),
  38. range_color=['#fffa76','#ff9300','#ff0518'],#'#F6CEF5', '#F7BE81', '#F78181'
  39. is_piecewise=True, # Enable piecewise mode
  40. pieces=[
  41. {"min": min(value), "max": 0.26, "label": "Low Risk"},
  42. {"min": 0.26, "max": 0.395, "label": "Medium Risk"},
  43. {"min": 0.395, "max": max(value), "label": "High Risk"},
  44. ],
  45. ),
  46. legend_opts=opts.LegendOpts(
  47. pos_top='top', # 调整图例位置至顶部
  48. pos_left='center' ,# 调整图例水平位置至中间
  49. ),
  50. )
  51. .render("world_map.html")
  52. )
  53. # Open HTML file
  54. os.system("world_map.html")
运行结果:

保存图片:

在生成图片的界面中,右键 ,会出现保存的选项

(3)主要有三个地方需要修改:

1.图例的颜色:

这个颜色可以选择自己喜欢的颜色,如果不知道如何搭配,可以选取论文中的搭配,也可以自己在网站里选取搭配好的颜色。

论文中的颜色提取:

截图:

放到ps中提取(或者自己常用的提取颜色的软件):用拾色器来提取颜色

网站配色:ColorSpace - Color Palettes Generator and Color Gradient Tool

        选择好想要的基准色,点击“Generate”就可以生成想要的配色了

2.图例的名称(图例的数量也是在这里改,加或减图例数量时记得加上对应的颜色个数)

3.标题的位置

         如图,目前是底下居中,如果想改的话就是pos_weizhi=‘weizhi’(weizhi是对应位置的英文名)

 2.第二种方法:

        这个方法麻烦一点,需要自己下载地图的数据包,目前我只找到中国的地图数据的下载办法,但是也是有优点,就是它的可调度会更好,可以自己设置图片的大小,图例的位置等。

(1)得到.csv文件

        方法同上。

(2)获取地图数据包.json文件

        进入网站DataV.GeoAtlas地理小工具系列,下载对应的数据包

(3).运行代码

        想要修改标题,图例,所用的颜色查看代码注释即可

  1. # author:雨洛lhw
  2. # date:2024/1/31
  3. import geopandas as gpd
  4. import pandas as pd
  5. import matplotlib.pyplot as plt
  6. import json
  7. # 1. 读取地理数据
  8. json_file_path = 'D:/MCM/数学建模/my_MCM/模拟赛资料/数据/map_data/中华人民共和国.json' # 中华人民共和国/
  9. geoData = gpd.read_file(json_file_path)
  10. with open(json_file_path, 'r', encoding='utf-8') as file:
  11. data = json.load(file)
  12. # 显示 JSON 结构
  13. print(json.dumps(data, indent=2))
  14. # 2. 读取待合并的数据
  15. yourDataFile = 'D:\python\py_project\ICM\data.csv'
  16. yourData = pd.read_csv(yourDataFile)
  17. # 3. 合并数据
  18. commonID = 'common_id'
  19. print("Columns in geoData:", geoData.columns)
  20. print("Columns in yourData:", yourData.columns)
  21. mergedData = geoData.merge(yourData, how='left', left_on='name', right_on='province')
  22. #合并结果检查
  23. print("Merged Data:")
  24. print(mergedData.head())
  25. # 4. 可视化数据
  26. fig, ax = plt.subplots(figsize=(8, 8), frameon=False) # frameon 用于关闭坐标轴
  27. # 只绘制population_density的数据
  28. mergedData.plot(column='population_density', cmap='Purples', linewidth=0.8, edgecolor='0.8', legend=False, ax=ax) # 这就是从白色到紫色
  29. # mergedData.plot(column='population_density', cmap='OrRd', linewidth=0.8, edgecolor='0.8', legend=False, ax=ax)
  30. # # column='population_density'用于指定要在地图上使用的数据列,legend=True用于显示图例,cmap='OrRd'用于选择颜色映射(可以根据需要选择其他颜色映射),
  31. # # linewidth和edgecolor用于设置地图边界的线宽和颜色。
  32. # 添加图例,并指定位置和文本大小
  33. # ax.legend(['Population Density'], loc='lower right', fontsize=10)
  34. # 标签和其他设置
  35. plt.xlabel('Longitude')
  36. plt.ylabel('Latitude')
  37. # 隐藏坐标轴
  38. ax.set_axis_off()
  39. plt.axis('off')
  40. # 添加标题
  41. plt.title('Population density of various provinces in China', y=-0.1) # 设置y参数以调整标题的垂直位置
  42. # 在plt.title()中,y参数控制标题的垂直位置,它表示标题的垂直偏移。具体来说,y=-0.1表示标题将垂直偏移到轴的下方。通常情况下,y的值在0和1之间,其中0表示轴的底部,1表示轴的顶部。负值(如y=-0.1)表示标题将偏移到轴的下方。这可以用来微调标题的位置,以便更好地适应图形。
  43. # 在你的情况下,如果标题不显示,尝试使用y参数调整标题的位置。但请注意,使用plt.suptitle()时,y参数用于调整整个图形的标题的垂直位置,而使用plt.title()时,y参数用于调整特定子图的标题的垂直位置。
  44. # 手动创建图例
  45. # color_map = plt.cm.ScalarMappable(cmap='OrRd') # 创建颜色映射对象
  46. color_map = plt.cm.ScalarMappable(cmap='Purples') # 创建颜色映射对象
  47. color_map.set_array(mergedData['population_density']) # 将数据映射到颜色映射
  48. color_map.set_clim(vmin=mergedData['population_density'].min(), vmax=mergedData['population_density'].max()) # 设置颜色映射的范围
  49. cbar = plt.colorbar(color_map, orientation='vertical', shrink=0.7, ax=ax) # 创建颜色条
  50. cbar.set_label('Population Density') # 设置颜色条的标签
  51. # color_map: 这是颜色映射对象,它指定了颜色映射的方式。
  52. # orientation='vertical': 这指定了颜色条的方向,垂直方向表示颜色条将垂直显示在图像的一侧。
  53. # shrink=0.7: 这是一个可选参数,它指定了颜色条的缩放比例,0.7意味着颜色条的长度将缩小为原始长度的70%。
  54. # ax=ax: 这指定了颜色条应该在哪个轴上绘制,即在我们创建的图形ax上。
  55. plt.show()

(4)运行结果:

(5)导出图片:

         

         以上就是我所掌握的地图画法,希望能对大家有所帮助,同时建议美赛主攻E题的小伙伴学习一下这种以地图形式呈现数据得方法。如果有什么不懂得可以私信我或者直接chatgpt,私信都是会回复的哦 。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/139797
推荐阅读
相关标签
  

闽ICP备14008679号