第4章【思考与练习2】数据文件high-speed rail.csv存放着世界各国高速铁路的情况。对世界各国高铁的数据进行绘图分析。使用Basemap绘制地图及使用Pyecharts绘制地图。

目录

P84思考与练习2

方法一:使用Basemap绘制地图

 方法二:使用Pyecharts绘制地图


P84思考与练习2

1.叙述各类图形的特点、适合展示的数据特性,以及在数据探索阶段的用途。

  • 函数绘图:可直观地观察两个变量之间的关系,可以为线性或逻辑回归等模型提供结果展示。x采样值越多,绘制曲线越精确。
  • 散点图:它将两组数据分别作为点的横坐标与纵坐标。可分析两个数据序列之间是否具有相关关系。可辅助线性或逻辑回归算法建立合理的预测模型。
  • 柱状图:用多个柱体描述单个总体处于不同状态的数量。易于展示数据的大小和比较数据之间的差别,还能用来表示均值和方差估计。
  • 折线图:用线条描述事物的发展变化及趋势。
  • 直方图:用于描述总体的频数分配情况。它将横坐标按区间个数等分,每个区间的高度表示区间样本的频数,面积表示数量。可观测数据的离散化情况。
  • 密度图:采用平滑的峰值函数来拟合概率密度函数,对真实的概率分布曲线进行模拟。
  • 饼图:描述总体的样本值构成比。饼图可清楚反映出部分与部分、部分与整体之间的数量关系。
  • 箱形图:适于表达数据的分位数分布帮助找到异常值。可以快速确定一个样本是否有利于进行分组判别。

2.数据文件high-speed rail.csv存放着世界各国高速铁路的情况。数据格式如下表所示。请对世界各国高铁的数据进行绘图分析。

Country

Operation

Under-construction

Planning

国家

运营里程(公里)

在建里程(公里)

计划里程(公里)

本书中所有的数据文件保存在data文件夹中,链接如下:

https://pan.baidu.com/s/1Tu__B-YfXDz_yXzbzNKB4A?pwd=sfw2 
提取码:sfw2
 

1)各国运营里程对比柱状图, 标注China为“Longest”,如下图:

列举以下三种方法:

【方法一】:读取文件未设置index_col = 0,则行索引为0~5的数字,而Series.plot画垂直柱状图(kind = 'bar')以行索引作为x刻度,需要重新设置x刻度值。

【方法二】:读取文件设置了index_col = 0,即选中"Country"列作为了行索引,Series.plot画垂直柱状图以行索引作为x刻度,不需要重新设置x刻度值

【方法三】:采用垂直柱状图函数plt.bar(x,y,width)画图 。

#方法一:未设置index_col = 0
import matplotlib.pyplot as plt
import pandas as pd
plt.figure()
data = pd.read_csv('data\High-speed rail.csv')   
#1)柱状图
data['Operation'].plot(kind = 'bar',title = 'Operation Mileage',rot = 45)   #rot旋转x轴刻度 #亦可单独加一行plt.xticks(rotation = 45)
plt.xticks(range(0,6),data['Country'])   
plt.annotate('Longest!',xy = (0,20000),xytext = (1,20000),color = 'red',arrowprops = dict(arrowstyle = '->',color = 'red'))   #此处标注位置直接用数字,
plt.xlabel('Country')
plt.ylabel('Mileage(km)')
plt.show()


#方法二,设置了index_col = 0
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
data = pd.read_csv('data\High-speed rail.csv',index_col = 0)
#1)柱状图
data['Operation'].plot(kind = 'bar',title = 'Operation Mileage',rot = 45)   
plt.annotate('Longest!',xy = (0,20000),xytext = (1,20000),color = 'red',arrowprops = dict(arrowstyle = '->',color = 'red'))
plt.xlabel('Country')
plt.ylabel('Mileage(km)')
plt.show()


#方法三:采用bar函数绘图。plt.bar(x,y,width)
import matplotlib.pyplot as plt
import pandas as pd
data1 = pd.read_csv('data\High-speed rail.csv')
#1)柱状图
plt.bar(data1['Country'],data1['Operation'],width = 0.5)     #此处进行柱状图宽度设置width,默认值0.8,稍宽。
plt.xticks(rotation = 45)
plt.annotate('Longest!',xy = (0,20000),xytext = (1,20000),color ='red',arrowprops = (dict(arrowstyle = '->',color = 'red')))
plt.title('Operation Mileage')
plt.xlabel('Country')
plt.ylabel('Mileage(km)')
plt.show()

       2)各国运营里程现状和发展堆叠柱状图,如下图:

  列举以下三种方法:

【方法一】:读取文件未设置index_col = 0,则行索引为0~5的数字,而Series.plot画水平柱状图(kind = 'barh')以行索引作为y刻度,需要重新设置y刻度值。

【方法二】:读取文件设置了index_col = 0,即选中"Country"列作为了行索引,Series.plot画水平柱状图以行索引作为y刻度,不需要重新设置y刻度值

【方法三】:采用水平柱状图函数plt.barh(y,x,height,label)画图 。

#方法一:不加index_col = 0
import matplotlib.pyplot as plt
import pandas as pd
data = pd.read_csv('data\High-speed rail.csv')
data[['Operation','Under-construction','Planning']].plot(kind = 'barh',stacked = True,title = 'Global trends of high-speed rail')
plt.yticks(range(0,6),data['Country'])      #注:此处为yticks设置坐标值
plt.xlabel('Mileage(km)')
plt.ylabel('Country')
plt.show()


#方法二:加index_col = 0
import matplotlib.pyplot as plt
import pandas as pd
data = pd.read_csv('data\High-speed rail.csv',index_col = 0)
data[['Operation','Under-construction','Planning']].plot(kind = 'barh',stacked = True,title = 'Global trends of high-speed rail')  #stacked为True表示堆叠
plt.xlabel('Mileage(km)')
plt.show()


#方法三:用barh函数画水平堆叠柱状图。plt.barh(y,x,height,label)
import matplotlib.pyplot as plt
import pandas as pd
data = pd.read_csv('data\High-speed rail.csv')
plt.barh(data['Country'],data['Operation'],height = 0.5,label = 'Operation')           #柱宽度用height
plt.barh(data['Country'],data['Under-construction'],left = data['Operation'],height = 0.5,label = 'Under-construction')          #此处用left
plt.barh(data['Country'],data['Planning'],left = data['Operation']+data['Under-construction'],height = 0.5,label = 'Planning')   #此处left为之前堆叠数据的和
plt.legend()    #显示图标
plt.title('Global trends of high-speed rail')
plt.xlabel('Mileage(km)')
plt.ylabel('Country')
plt.show()

       3)各国运营里程占比饼图,China扇形离开中心点,如下图:

列举以下三种方法:

【方法一】:读取文件未设置index_col = 0,则行索引为0~5的数字,而Series.plot画扇形图(kind = 'pie')以行索引作为扇形块的标签(labels),需要重新设置扇形块的标签。

【方法二】:读取文件设置了index_col = 0,即选中"Country"列作为了行索引,Series.plot画扇形图以行索引扇形块标签,不需要重新设置扇形块的标签(labels)

【方法三】:采用扇形图函数plt.pie(x,labels,startangle,autopct,shadow,explode)画图 。

#方法一:不加index_col = 0,需要自己设置labels
import matplotlib.pyplot as plt
import pandas as pd
data = pd.read_csv('data\High-speed rail.csv')
data['Operation'].plot(kind = 'pie',labels = data['Country'],startangle = 60,autopct = '%1.1f%%',shadow = True,explode = [0.1,0,0,0,0,0],title = 'Opeartion Mileage')
plt.ylabel('')     #删除饼图中调用Series中的值的名称“Operation”
plt.show()


#方法一:加index_col = 0
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
data = pd.read_csv('data\High-speed rail.csv',index_col = 0)
data['Operation'].plot(kind = 'pie',startangle = 60,autopct = '%1.1f%%',shadow = True,explode = [0.1,0,0,0,0,0],title = 'Opeartion Mileage')
plt.ylabel('')      #删除饼图中调用Series中的值的名称“Operation”
plt.show()


#方法三:用pie()函数
import matplotlib.pyplot as plt
import pandas as pd
data = pd.read_csv('data\High-speed rail.csv')       
plt.pie(data['Operation'],labels = data['Country'],startangle = 60,autopct = '%1.1f%%',shadow = True,explode = [0.1,0,0,0,0,0])
plt.title('Opeartion Mileage')
plt.show()

  4)绘制现有里程的地图,用不同颜色表示数量由大到小。

 提示】:
(1)从文件中读取数据时,使用第一列数据作为index:
        data = pd.read_csv(‘High-speed rail.csv’, index_col =‘Country’) ,获取中国对应的数据行,使用data ['China’]。

本题思路有二:

【思路一】:使用Basemap函数绘制散点图,用不同颜色散点的大小表示里程。

【思路二】:使用Pyecharts绘制交互式地图,用不同形状、颜色的点来表示里程。

方法一:使用Basemap绘制地图

前言:

安装教程:

Basemap安装使用简介 开源地理空间基金会中文分会 开放地理空间实验室https://www.osgeo.cn/post/17d83

使用教程:

工作台 - Heywhale.comhttps://www.heywhale.com/mw/project/61b062e6c63c620017bd2b7d

一些说明:

在地图中,“东西经,南北纬”。“上北下南,左西右东”。记住这两句话,画图会轻松不少。

Basemap()内部参数中:

projection:代表投影方式。不设置一般默认为'cyl',为经纬度投影。

lon_0:表示地图中心点的经度值。lat_0则表示地图中心点的纬度值。

lon_0范围为[0,360]分别对应[0°E,180°E,180°W,0°W](便大家理解,故这样写),其中纬度lat_0与经度设置类似。设置lon_0 = 160和lon_0 = 240。

我们看看效果图:

再根据一个小例子了解一下Basemap绘图的基本操作:

import numpy as np
from mpl_toolkits.basemap import Basemap          #导入Basemap函数
import matplotlib.pyplot as plt                   
plt.figure(figsize = (16,8))                      
m = Basemap()         #实例化一个map,Basemap()默认lon_0=0,lat_0=0,projection = 'cyl'(经纬度投影)。
#Basemap里面无参数,画出为全球地图

m.drawcoastlines(linewidth = 1,color = 'red')           #绘制海岸线,设置线宽、颜色
m.drawstates()               #绘制州界(主要北美洲、南美洲与澳大利亚)
m.drawcountries()            #绘制国界
m.drawmapboundary(fill_color='white')      #背景图颜色
m.fillcontinents(color='yellow',lake_color='purple')     # 画大洲,颜色填充为黄色,内陆湖为紫色
m.drawmapboundary(fill_color='aqua')                     #对海洋进行颜色填充,aqua为湖绿色

m.drawparallels(np.arange(-90., 91.,10.),labels=[1,1,1,1], fontsize=10,color='green')          #在图中横线是绿色
#南北纬标签设置,labels中0可用False代替,1可用True代替,labels中前两个数决定标注的左右位置
m.drawmeridians(np.arange(-180., 181.,20.),labels=[1,1,0,1], fontsize=10,color = 'blue')       #在图中竖线是蓝色
#东西经标签设置,labels中后两个数决定标注的上下位置

plt.savefig('name1.jpg',dpi = 400,bbox_inches = 'tight')      #将地图保存为一个图像
plt.show()

 运行结果:

下面开始做题:

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import pandas as pd
from pandas import DataFrame
import numpy as np

data = pd.read_csv('data\High-speed rail.csv',index_col = 0)
print(data['Operation'])

plt.figure(figsize = (16,8))
m = Basemap(llcrnrlon = -10,urcrnrlon = 150,llcrnrlat = 0, urcrnrlat = 80)     
#局部绘图参数。llcrnrlon与urcrnrlon分别为地图的经度范围最小值与最大值。
#llcrnrlat与urcrnrlat分别为地图纬度范围的最小值与最大值。

m.drawcountries(linewidth = 1)            #国界
m.drawstates()                            #州界
m.drawcoastlines(linewidth = 1)           #海岸线

lat = np.array(data['Latitude'])          #获取各区纬度值
lon = np.array(data['Longitude'])         #获取各区经度值
Ope = np.array(data["Operation"])         #获取运营里程值
size=(Ope/np.max(Ope))*1000               #绘制散点图时里程值对应点的大小
x,y = m(lon,lat)                          #确定各区经纬度坐标点
m.scatter(x,y,s=size,color =['#f6941d','#00FF00','#585eaa','#ea66a6','#54211d','#ffd400'])      #在地图上绘制散点图

parallels = np.arange(-90.,91.,10.) 
m.drawparallels(parallels,labels=[1,0,0,0],fontsize=10)   #绘制纬线,设置标注字体大小
meridians = np.arange(-180.,181.,20)
m.drawmeridians(meridians,labels=[0,0,0,1],fontsize=10)   #绘制经线
#m.etopo()            #绘制地形图,浮雕样式 
#m.shadedrelief()     #绘制阴影地图浮雕
plt.savefig('name2.jpg',dpi = 400,bbox_inches = 'tight') 
plt.show()

运行结果如下:

还可用shadedrelief() 绘制阴影浮雕地图: 

还可用etopo() 绘制地形图,浮雕样式:

 方法二:使用Pyecharts绘制地图

前言:

pyecharts主要用Map,Geo,BMap函数绘制交互式地图。可视化效果较好,绘图结果保存为.html网页格式,支持在Jupyter Notebook等Web 框架中使用,一般的编译环境如Spyder,Sublime中无法显示结果。

知乎入门:

就是这么简单!Pyecharts绘制可视化地图大全 - 知乎https://zhuanlan.zhihu.com/p/370741946

使用教程:

pyecharts - A Python Echarts Plotting Library built with love.https://pyecharts.org/#/zh-cn/geography_charts?id=map%EF%BC%9A%E5%9C%B0%E5%9B%BE

① 使用Map函数绘制散点图,有连续色度条

#使用Map()函数绘图,连续色度条
import pandas as pd
from pyecharts.charts import Map
from pyecharts import options as opts
from pyecharts.globals import ThemeType

data = pd.read_csv('data/High-speed rail.csv',index_col = 0)
country = data.index.tolist()
Operation = data['Operation'].tolist()

c = (                         #pyecharts中支持链式调用
        Map(init_opts=opts.InitOpts(theme=ThemeType.WESTEROS))       #设置背景风格
        .add("", [list(z) for z in zip(country,Operation)],"world")  
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))   #不显示地图标签(即国家名称)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="世界各国高铁运营里程图",pos_left='center',
                                  title_textstyle_opts=opts.TextStyleOpts(font_size=25)),
            visualmap_opts=opts.VisualMapOpts(max_ = 22000,min_=900))
    .render("Operation1.html")
)

运行结果如下: 

② 使用Map函数绘制散点图,色度分段

#使用Map()函数绘图,色度分阶
import pandas as pd
from pyecharts.charts import Map
from pyecharts import options as opts
from pyecharts.globals import ThemeType

data = pd.read_csv('data/High-speed rail.csv',index_col = 0)
country = data.index.tolist()
Operation = data['Operation'].tolist()

c = (
        Map(init_opts=opts.InitOpts(theme=ThemeType.WESTEROS))   
        .add("", [list(z) for z in zip(country,Operation)],"world")       
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="世界各国高铁运营里程图",pos_left='center',
                                  title_textstyle_opts=opts.TextStyleOpts(font_size=25)),
            visualmap_opts=opts.VisualMapOpts(
            is_piecewise=True,pieces =[
                {"max": 2000, "min": 1, "label": "1~2000", "color": "#00FFFF"},
                 {"max": 4000, "min": 2001, "label": "2001~4000", "color": "#FF1493"},
                 {"max": 25000, "min": 4000, "label": ">=4001", "color": "#FF0000"}]))
    .render("Operation2.html")
)

运行结果如下: 

③使用Geo函数绘制涟漪特效散点图,色度分段

#使用Geo()函数绘图 ,涟漪图
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.globals import ThemeType, CurrentConfig, GeoType
import json

data = pd.read_csv('data/High-speed rail.csv')
print(data)

#自定义坐标,写在json文件,以JOSN文件格式新增多个坐标点
data_json={}
for index,row in data.iterrows():    #iterrows() 是在数据框中的行进行迭代的一个生成器,它返回每行的索引及一个包含行本身的对象
    data_json[row['Country']]=[float(row['Longitude']),float(row['Latitude'])]
with open("Ope_MAP.json","w") as f:
    json.dump(data_json,f)

geo = ( Geo(init_opts=opts.InitOpts(width='800px', 
                                   height='600px', 
                                   theme=ThemeType.WESTEROS))    #维斯特洛大陆风格
       .add_coordinate_json("Ope_MAP.json")              #加载自定义坐标
       .add_schema(maptype='world')
       .add("",data_pair=[list(z) for z in zip(data['Country'].tolist(),data['Operation'].tolist())], 
            type_=GeoType.EFFECT_SCATTER, 
            symbol_size=10)       
       .set_series_opts(label_opts=opts.LabelOpts(is_show=False))      # is_show=True/False 是否显示标签
       .set_global_opts(
            title_opts=opts.TitleOpts(title="世界各国高铁运营里程图",pos_left='center',
                                  title_textstyle_opts=opts.TextStyleOpts(font_size=25)),
            visualmap_opts=opts.VisualMapOpts(is_piecewise=True,pieces =[
                {"max": 2000, "min": 1, "label": "1~2000", "color": "#00FFFF"},
                 {"max": 4000, "min": 2001, "label": "2001~4000", "color": "#FFD700"},
                 {"max": 25000, "min": 4001, "label": ">=4001", "color": "#FF0000"}]))
      )
geo.render("Operation3.html")

 运行结果如下:

 ④使用Geo函数绘制涟漪效果散点图,修改点大小(也可用for循环)

#使用Geo()函数绘图 ,涟漪点,大小不同(按比例)
import pandas as pd
import numpy as np
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.globals import ThemeType, ChartType, GeoType

data = pd.read_csv('data/High-speed rail.csv')
Ope = np.array(data["Operation"])
size = (Ope/np.max(Ope))*100
print(data)

geo = Geo(init_opts=opts.InitOpts(width='800px',height='600px',theme=ThemeType.ESSOS)) 
geo.add_schema(maptype='world',center = [70,40])          #定位的左上角以及右下角
geo.add_coordinate('China',116.24,39.55)
geo.add("",data_pair =[('Chian',22000)],symbol_size =100 ,type_=GeoType.EFFECT_SCATTER,symbol = "pin")              #symbol = "pin"决定形状为水滴状
geo.add_coordinate('Japan',139.69,35.42)
geo.add("",data_pair =[('Japan',2900)],symbol_size =13.18 ,type_=GeoType.EFFECT_SCATTER,symbol = "pin")    
geo.add_coordinate('France',2.21,48.51)
geo.add("",data_pair =[('France',2100)],symbol_size =9.55 ,type_=GeoType.EFFECT_SCATTER,symbol = "pin")    
geo.add_coordinate('Germany',13.25,52.30)
geo.add("",data_pair =[('Germany',1500)],symbol_size =6.82 ,type_=GeoType.EFFECT_SCATTER,symbol = "pin")   
geo.add_coordinate('Spain',-3.45,40.25)
geo.add("",data_pair =[('Spain',2900)],symbol_size =13.18 ,type_=GeoType.EFFECT_SCATTER,symbol = "pin")
geo.add_coordinate('Italy',12.50,41.80)
geo.add("",data_pair =[('Italy',900)],symbol_size =4.10 ,type_=GeoType.EFFECT_SCATTER,symbol = "pin")

geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False),effect_opts=opts.EffectOpts(scale=5))  
geo.set_global_opts(title_opts=opts.TitleOpts(
            title="世界各国高铁运营里程图",pos_left='center',
            title_textstyle_opts=opts.TextStyleOpts(font_size=25)),
            visualmap_opts=opts.VisualMapOpts(is_piecewise=True,pieces =[
                {"max": 2000, "min": 1, "label": "1~2000", "color": "#00FFFF"},
                 {"max": 4000, "min": 2001, "label": "2001~4000", "color": "#FFD700"},
                 {"max": 25000, "min": 4001, "label": ">=4001", "color": "#FF0000"}]))
geo.render("Operation4.html")

运行结果如下:

【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于Python编写的国城市轨道交通数据可视化分析项目源码+项目说明.zip ## 概述 > - 本项目是一个基于 Python 的简单数据可视化分析的小Demo。通过这个项目可以练习使用Python数据可视化分析相关的强大的库和模块,练习绘制简单的GUI界面并且连接数据库,更加深了对Python语言的学习和拓展。本项目也可作为学校的大作业、大实验实践或者课程设计等的选题项目。 > - 本项目通过多线程爬虫获取了高德地图国轨道交通的一些数据信息,高德地图这个权威的网站也保证了数据的完整可靠性,然后进行了一些简单并且有趣的数据可视化分析,另外还设计了一个GUI界面,查询数据库或者文件的一些信息。 > > - 如发现文档或者源代码有错误,欢迎大家在 `Issues` 研究讨论,欢迎大家 `Fork` 和 `Pull requests` 改善代码,十分感谢! ## 使用语言 - Python 3 ## 主要技术 * **网络编程** * **多线程** * **文件操作** * **数据库编程** * **GUI** * **数据分析** ## 导入的库和模块 ```python import json import requests from bs4 import BeautifulSoup import sqlite3 import threading import tkinter as tk from tkinter import scrolledtext import pandas as pd from pyecharts import Line, Bar, Geo import numpy as np from wordcloud import WordCloud, ImageColorGenerator import jieba import matplotlib.pyplot as plt import seaborn as sns ``` ## 项目整体思路 1. 网页分析 2. 多线程爬虫爬取信息 3. 数据保存至文件数据 4. 利用 tkinter 绘制 GUI 界面,实现查询线路和站点两个功能 5. 数据可视化分析 (1)直接控制台显示分析结果 (2)绘制国地图、柱状图等,生成 .html 文件 (3)绘制词云 (4)绘制柱状图、饼状图、折线图、散点图、双变量图等,生成 .png 文件 ## 运行 - 分别运行`src`文件的`.py`文件即可 ## 部分运行结果样例 .....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是学数据分析的阿龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值