这一次作业是用数据画地图
所涉及的函数和python知识如下(每一个我都写成小标题格式,方便我以后自己查找
参考文档
手把手教你画数据地图之进阶篇 - Yuhao Zhu, Ph.D.
相关包
import matplotlib.pyplot as plt
import geopandas as gpd
from matplotlib_scalebar.scalebar import ScaleBar
import contextily as cx
将SHP文件进行读取,并且编码为“utf-8”
basemap_line = gpd.read_file(basemap_line_file,encoding='utf-8')
#basemap_line_file是文件地址
取数据表某一列数据
new_line_name=basemap_line["line_name"]
#line_name是列名
截取每个数据中的一部分内容
我用的方法比较负责,直接就暴力拆解
# To do: 由于line_name的名字太长,将其截断为几号线,并存储为新的列表new_line_name
new_line_name=basemap_line["line_name"]
n=0
for i in new_line_name:
str1=str(i)[2:6]
if str(i)[5]!='线':
str1=str(i)[2:5]
new_line_name.loc[n]=str1
n=n+1
print(new_line_name)
将文字显示成中文格式
加入第一行代码即可
mpl.rcParams['font.sans-serif']=['SimHei']
或者
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False #正常显示负号
用plt设置图像的大小
plt.figure(figsize=(10,8))
10是长,8是宽
去掉重复的内容
basemap_station['station_na'].unique()
表格提取两列
如果一个表格里面由lng84,lat84这两列,和其他列,而我们要提取lng84,lat84这两列,这个时候需要两个中括号
x = shenzhen_station_shp[["lng84","lat84"]]
KMeans聚类
# To do: 读取深圳_station.shp文件,利用经纬度的值进行聚类分析,并将结果画出来,需要画出聚类中心,lat纬度,lng经度
shenzhen_station_shp=gpd.read_file("D:\大学\大二上\数据科学导论\实验六\深圳_station.shp",encoding='utf-8')
x = shenzhen_station_shp[["lat84","lng84"]]
X=x.values.astype(float)
kmeans = KMeans(7) # 构建聚类器
y_kmeans=kmeans.fit_predict(X) # 训练聚类器
#找出最大最小经纬度
max_lat=shenzhen_station_shp["lat84"].max()
min_lat=shenzhen_station_shp["lat84"].min()
max_lng=shenzhen_station_shp["lng84"].max()
min_lng=shenzhen_station_shp["lng84"].min()
plt.figure(figsize=(10,6))
plt.scatter(kmeans.cluster_centers_[:, 0],kmeans.cluster_centers_[:, 1], s=20, color='black',label='Centroids')
plt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s = 5, c = 'red', label = 'Cluster 1')
plt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s = 5, c = 'g', label = 'Cluster 2')
plt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s = 5, c = 'm', label = 'Cluster 3')
plt.scatter(X[y_kmeans == 3, 0], X[y_kmeans == 3, 1], s = 5, c = 'c', label = 'Cluster 4')
plt.scatter(X[y_kmeans == 4, 0], X[y_kmeans == 4, 1], s = 5, c = 'y', label = 'Cluster 5')
plt.scatter(X[y_kmeans == 5, 0], X[y_kmeans == 5, 1], s = 5, c = 'b', label = 'Cluster 6')
plt.scatter(X[y_kmeans == 6, 0], X[y_kmeans == 6, 1], s = 5, c = 'orange', label = 'Cluster 7')
plt.xticks(np.arange(22.4,22.85, step=0.03))
plt.yticks(np.arange(113.75,114.40, step=0.03))
#图例设置
plt.title("Metro Stations in Shenzhen", fontsize=22)
plt.ylabel('Longitude', fontsize=18)
plt.xlabel('Latitude', fontsize=18)
搞了好几个小时,一开始画出的图是这样的
一开始没加上括号里面的东西,搞了很久
X=x.values(.astype(float))
将不想要的取值的行去掉
x=data.loc[data["station_in"]!="None"]
x=x.loc[x["station_out"]!="None"]
统计一列数据出现次数
station_in_num=pd.DataFrame(x.station_in.value_counts())
station_in_num