用外星人目击数据集来学习如何将位置数据可视化
位置数据
位置数据(Spatial Data)或地理数据(Geospatial Data)是指描述地理位置、形状、大小、以及其他与空间相关的信息的数据。这类数据广泛应用于地理信息系统(GIS)、遥感、导航系统、城市规划、环境监测等领域。位置数据不仅可以表示具体的地理位置,还能描述与空间相关的属性,如地形、气候、人口分布等。
位置数据的类型
矢量数据(Vector Data):
点(Points): 表示具体位置的单个点,例如城市的位置、商店的位置、交通事故发生地点等。每个点都有一个具体的坐标(如经纬度)。 线(Lines): 连接多个点形成的线段,用于表示线性特征,例如河流、道路、铁路等。 多边形(Polygons): 由多条线围成的闭合区域,用于表示面积特征,如国家边界、湖泊、森林、城市区域等。
栅格数据(Raster Data):
栅格数据是由规则网格组成的,类似于图像的像素,每个网格(像素)代表空间中的一个区域,并包含关于该区域的信息。栅格数据常用于表示连续变化的现象,如卫星图像、地形图、气候数据(如温度分布、降水量)等。
地理坐标系(Geographic Coordinate Systems):
用于确定地球表面位置的坐标系统。最常见的是经度和纬度(Latitude and Longitude),它们定义了地球表面上的点。地理坐标系还包括高度数据(海拔),用于描述地球表面某一点相对于基准面的高度。
外星人和数据集
我们今天的演示将使用一组外星人目击数据,其中位置是用经纬度来表达的。除了经纬度,数据集还包含了目击日期;目击国家;目击城市;目击飞碟形状;目击持续时间等
代码演示和解析
导入环境
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
读取数据集
ufo = pd.read_csv('/content/scrubbed.csv')
整理数据
ufo['latitude'] = pd.to_numeric(ufo['latitude'], errors='coerce')
ufo['longitude '] = pd.to_numeric(ufo['longitude '], errors='coerce')
# Convert the column to datetime, coercing errors to NaT
ufo['datetime'] = pd.to_datetime(ufo['datetime'], format='%d/%m/%Y %H:%M:%S', errors='coerce')
print(ufo['country'].unique())
# Drop rows where the conversion failed (i.e., where 'datetime' is NaT)
df = ufo.dropna(subset=['datetime'])
print(ufo.shape[0])
ufo['strla'] = ufo['latitude'].astype(float)
ufo['strlo'] = ufo['longitude '].astype(float)
ufo['latitude'] = pd.to_numeric(ufo['latitude'], errors='coerce')
将 ufo 数据框中的 latitude(纬度)列转换为数值型数据。如果转换失败(例如,遇到无法转换为数字的值),这些值将被设置为 NaN(即“缺失值”)。ufo['longitude '] = pd.to_numeric(ufo['longitude '], errors='coerce')
同样地,将 ufo 数据框中的 longitude(经度)列转换为数值型数据。注意:此行代码中 longitude 列名后有一个空格,这可能是无意的空格,建议删除以避免潜在问题。转换失败的值同样会被设置为 NaN。ufo['datetime'] = pd.to_datetime(ufo['datetime'], format='%d/%m/%Y %H:%M:%S', errors='coerce')
将 ufo 数据框中的 datetime(日期时间)列转换为 datetime 类型,格式为 日/月/年 小时:分钟:秒。如果转换失败,则这些值将被设置为 NaT(即“缺失日期时间”)。print(ufo['country'].unique())
输出 ufo 数据框中 country(国家)列的唯一值。这通常用于检查数据中的不同国家值。df = ufo.dropna(subset=['datetime'])
删除 datetime 列中包含 NaT 值的行。这一步骤保留了那些日期时间格式转换成功的行,并去除了无法解析的日期时间。print(ufo.shape[0])
输出 ufo 数据框的行数。这可以帮助了解数据框中包含了多少行数据。ufo['strla'] = ufo['latitude'].astype(float)
将 latitude 列转换为 float 类型,并将其存储在一个名为 strla 的新列中。ufo['strlo'] = ufo['longitude '].astype(float)
将 longitude 列转换为 float 类型,并将其存储在一个名为 strlo 的新列中。再次注意:longitude 列名中有一个空格,可能会导致问题。
绘图
plt.figure(figsize=(21, 14))
# Create a Basemap instance
m = Basemap(projection='merc', llcrnrlat=-60, urcrnrlat=80, llcrnrlon=-180, urcrnrlon=180, resolution='c')
# Draw coastlines and countries
m.drawcoastlines()
m.drawcountries()
# Plot the points on the map
lon = ufo['strlo'].values
lat = ufo['strla'].values
x, y = m(lon, lat)
m.scatter(x, y, s=10, c='red', marker='o', alpha=0.7)
# Adding title
plt.title('World Map with Latitude and Longitude Points')
# Show the plot
plt.show()
plt.figure(figsize=(21, 14))
创建一个图形对象,并设置图形的大小。这里设置的大小是21x14英寸。m = Basemap(projection='merc', llcrnrlat=-60, urcrnrlat=80, llcrnrlon=-180, urcrnrlon=180, resolution='c')
创建一个 Basemap 实例,用于绘制地图。projection='merc'
指定使用墨卡托投影。llcrnrlat=-60
和urcrnrlat=80
分别设置地图的南北边界纬度。llcrnrlon=-180
和urcrnrlon=180
分别设置地图的东西边界经度。resolution='c'
设置地图轮廓的分辨率为粗糙级别。m.drawcoastlines()
在地图上绘制海岸线。m.drawcountries()
在地图上绘制国家边界。lon = ufo['strlo'].values
提取 ufo 数据框中 strlo(经度)列的所有值,并将其存储在 lon 数组中。lat = ufo['strla'].values
提取 ufo 数据框中 strla(纬度)列的所有值,并将其存储在 lat 数组中。`x, y = m(lon, lat) 使用 Basemap 实例 m 将经纬度坐标(lon 和 lat)转换为地图投影下的 x 和 y 坐标。
m.scatter(x, y, s=10, c='red', marker='o', alpha=0.7)
在地图上绘制散点图。
x
,y
是要绘制的点的坐标。s=10
设置点的大小为 10。c='red'
将点的颜色设置为红色。marker='o'
指定点的形状为圆形。alpha=0.7
设置点的透明度为 0.7(稍微透明)。
plt.title('World Map with Latitude and Longitude Points')
为图形添加标题“World Map with Latitude and Longitude Points”。plt.show()
显示绘制好的地图和散点图。
拓展
虽然图已经做出来了,但是不光不美观,能够给我么的直观信息也没有多少。所以我们在拓展部份给我们的图表增加一个使用颜色来代表目击时间的功能:
# Convert the column to datetime, coercing errors to NaT
ufo['datetime'] = pd.to_datetime(ufo['datetime'], format='%d/%m/%Y %H:%M:%S', errors='coerce')
# Extract the year
ufo['year'] = ufo['datetime'].dt.year
# Normalize the datetime column to create a colormap
ufo['date_normalized'] = (ufo['year'] - ufo['year'].min()) / (ufo['year'].max() - ufo['year'].min())
# Map the normalized datetime to colors using a colormap
cmap = plt.cm.inferno # You can choose any colormap you like
colors = cmap(ufo['date_normalized'])
# Plot the world map
plt.figure(figsize=(21, 14))
m = Basemap(projection='merc', llcrnrlat=-60, urcrnrlat=80, llcrnrlon=-180, urcrnrlon=180, resolution='c')
# Draw coastlines and countries
m.drawcoastlines()
m.drawcountries()
# Plot the points on the map with colors based on the datetime
lon = ufo['longitude '].values
lat = ufo['latitude'].values
x, y = m(lon, lat)
sc = m.scatter(x, y, s=10, color=colors, marker='o', alpha=0.7)
# Adding a colorbar to show the relationship between the color and the date
cbar = plt.colorbar(sc, orientation='vertical', shrink=0.5, aspect=10)
cbar.set_label('Year (Normalized)', rotation=270, labelpad=20)
# Adding title
plt.title('World Map with UFO Sightings (Color Coded by Date)')
# Show the plot
plt.show()
ufo['datetime'] = pd.to_datetime(ufo['datetime'], format='%d/%m/%Y %H:%M:%S', errors='coerce')
将 ufo 数据框中的 datetime(日期时间)列转换为 datetime 类型,格式为 日/月/年 小时:分钟:秒。如果转换失败,则这些值将被设置为 NaT。ufo['year'] = ufo['datetime'].dt.year
从 datetime 列提取年份,并将其存储在 year 列中。这将帮助后续步骤中的日期标准化和颜色映射。ufo['date_normalized'] = (ufo['year'] - ufo['year'].min()) / (ufo['year'].max() - ufo['year'].min())
对年份数据进行标准化处理,使其在 0 和 1 之间变化。具体来说,这一步是通过减去最早的年份并除以年份范围来实现的。这是为了将年份映射到一个颜色范围中。cmap = plt.cm.inferno
选择一种颜色映射(colormap),这里使用的是 inferno,一种从黑色到橙色再到黄色的渐变色映射。你可以根据需要选择其他的 colormap。colors = cmap(ufo['date_normalized'])
将标准化后的日期映射到颜色上。colors 数组将包含每个UFO目击点的颜色值,这些颜色值根据日期的不同而变化。plt.figure(figsize=(21, 14))
创建一个图形对象,并设置图形的大小为21x14英寸。m = Basemap(projection='merc', llcrnrlat=-60, urcrnrlat=80, llcrnrlon=-180, urcrnrlon=180, resolution='c')
创建一个 Basemap 实例,用于绘制地图,使用墨卡托投影,地图范围为从南纬60度到北纬80度,西经180度到东经180度,分辨率为粗糙级别。m.drawcoastlines()
在地图上绘制海岸线。m.drawcountries()
在地图上绘制国家边界。lon = ufo['longitude '].values
提取 ufo 数据框中 longitude(经度)列的所有值,并将其存储在 lon 数组中。lat = ufo['latitude'].values
提取 ufo 数据框中 latitude(纬度)列的所有值,并将其存储在 lat 数组中。x, y = m(lon, lat)
使用 Basemap 实例 m 将经纬度坐标转换为地图投影下的 x 和 y 坐标。sc = m.scatter(x, y, s=10, color=colors, marker='o', alpha=0.7)
在地图上绘制散点图,每个点的颜色基于标准化后的日期数据。
s=10 设置点的大小为 10。 color=colors 设置每个点的颜色。 marker='o' 指定点的形状为圆形。 alpha=0.7 设置点的透明度为 0.7。 cbar = plt.colorbar(sc, orientatio6. n='vertical', shrink=0.5, aspect=10)添加一个颜色条,以显示颜色与日期之间的对应关系。
orientation='vertical'
将颜色条设置为垂直方向。shrink=0.5
将颜色条缩小到原始长度的50%。aspect=10
设置颜色条的宽高比。cbar.set_label('Year (Normalized)', rotation=270, labelpad=20)
为颜色条添加标签“Year (Normalized)”,并将其旋转270度(使其垂直显示),标签距离颜色条的距离为20个单位。plt.title('World Map with UFO Sightings (Color Coded by Date)')
为图形添加标题“World Map with UFO Sightings (Color Coded by Date)”。plt.show()
显示绘制好的地图和散点图。
本文作者:徐可
现在:
长按扫码关注:科研生信充电宝
10元赞赏本文,即喜欢作者~
即可直接解锁:
《跟着高分SCI学画图:GPT教你绘制地理位置数据》对应资源哦~
看到这里你还不心动吗?
赶紧关注、转发、点赞、分享,领取你的专属福利吧~
好啦,以上就是今天推文的全部内容啦!
版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本公众号不拥有所有权,也不承担相关法律责任。
如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:kysxcdb@163.com 进行举报,一经查实,本公众号将立刻删除涉嫌侵权内容。