第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”,如下图:

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

列举以下三种方法:

【方法一】:读取文件未设置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)各国运营里程现状和发展堆叠柱状图,如下图:

第4章【思考与练习2】数据文件high-speed rail.csv存放着世界各国高速铁路的情况。对世界各国高铁的数据进行绘图分析。使用Basemap绘制地图及使用Pyecharts绘制地图。_第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扇形离开中心点,如下图:

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

列举以下三种方法:

【方法一】:读取文件未设置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。

我们看看效果图:

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

再根据一个小例子了解一下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()

 运行结果:

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

下面开始做题:

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()

运行结果如下:

第4章【思考与练习2】数据文件high-speed rail.csv存放着世界各国高速铁路的情况。对世界各国高铁的数据进行绘图分析。使用Basemap绘制地图及使用Pyecharts绘制地图。_第6张图片还可用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")
)

运行结果如下: 

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

② 使用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")
)

运行结果如下: 

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

③使用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")

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

 ④使用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")

运行结果如下:

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

你可能感兴趣的:(《数据科学技术与应用》学习笔记,数据分析,python)