美文网首页
Python 数据可视化:高级制图案例剖析

Python 数据可视化:高级制图案例剖析

作者: you的日常 | 来源:发表于2020-12-09 10:44 被阅读0次

Plotly 的内容非常多,不过,本着“弱水三千、只取一瓢饮”的原则,本文仅详细介绍一些基本知识,并借着这些知识向读者说明掌握 Plotly 制图的基本方法,特别是本达人课中反复强调过的方法——阅读文档。理解和使用这些方法,才是将来在项目实践中所向无敌的保证。

本课会再选几个示例展示一些高级的制图方法。

4.4.1 地理信息可视化

地理信息可视化是数据可视化中一个非常重要的分支。前面若干课的工具都能实现地理信息可视化,但是此前并没有介绍,因为还要安装很多别的东西,比较麻烦。其实 Plotly 提供了比较简单的实现方式,因为它整合了 Mapbox。

Mapbox,官方网站:www.mapbox.com,是一家向移动端和 Web 应用提供地图数据的服务商。

首先,要到 Mapbox 官方网站注册,然后取得 token;接下来就能做地理信息可视化了。

import plotly
import plotly.graph_objs as go

mapbox_access_token = "your_mapbox_access_token"

data = [go.Scattermapbox(lat = ['31.3'],
                         lon = ['120.7'],
                         mode = 'markers',
                         marker = dict(size = 20, colo r= 'red'),
                         text=['Soochow'],
                        )]
layout = go.Layout(autosize = True, 
                   hovermode = 'closest',
                   mapbox = dict(accesstoken = mapbox_access_token,
                                 bearing = 0,
                                 center = dict(lat = 31.3, lon = 120.7),
                                 pitch = 0,
                                 zoom=10
                                ),
                  )

fig = dict(data=data, layout=layout)
plotly.offline.plot(fig, filename='Soochow')

enter image description here

这里的截图仅是部分界面,看到图中的红点了吧,那个就是上面的程序中要在地图上标记的点。下面就看看是如何实现这种效果的。

跟前面各节绘制的图示一样,地理信息的图示在 Plotly 中也是一种 Trace 对象,它由 plotly.graph_objs.Scattermapbox 生成。

go.Scattermapbox(arg=None, connectgaps=None, customdata=None, customdatasrc=None, fill=None, fillcolor=None, hoverinfo=None, hoverinfosrc=None, hoverlabel=None, hovertext=None, hovertextsrc=None, ids=None, idssrc=None, lat=None, latsrc=None, legendgroup=None, line=None, lon=None, lonsrc=None, marker=None, mode=None, name=None, opacity=None, selected=None, selectedpoints=None, showlegend=None, stream=None, subplot=None, text=None, textfont=None, textposition=None, textsrc=None, uid=None, unselected=None, visible=None, **kwargs)

在本例中,使用了部分参数,具体如下。

  • lat = ['31.3']:所标记地点的纬度,以北纬为正数。
  • lon = ['120.7']:所标记地点的经度,以东经为正数。注意,lat 和 lon 两个参数的值都是列表,也就意味着还可以标记多个地点,只是本例中只标记了一个地点。
  • mode='markers':所标记地点在图上显示符号。
  • marker=dict(size=20,color='red'):对标记符号的大小、颜色等属性的设置。
  • text=['Soochow']:标记点的文本显示。当鼠标移动到该点时会显示此列表中的元素。

只有 Trace 对象,最终还不能得到图示结果。Trace 对象仅是地理信息,其背景图应该是地图,这就要在 go.Layout 中指定要读入的地图了。在以往的示例中,虽然也多次应用它,但是所使用的参数与本示例有差别,毕竟这里要用地图作为布局了。

  • autosize = True:确定图示自动适应页面大小。
  • hovermode:设置鼠标悬停的交互操作,通常与之配套操作的还有参数 clickmode。默认值为 'closest',意即鼠标靠近标记对象实现交互操作。
  • mapbox:这是实现地图作为背景的关键参数。它的值是以字典形式提供的跟地图有关的属性映射。
    • accesstoken:前文已经提到过的 Mapbox,此键的值就是在 Mapbox 上注册后获得的 token。
    • bearing:默认值为 0。用于设置地图上的方位角。
    • center:以 {'lon': number, 'lat': number} 的形式设置最终图示中心的经纬度位置。
    • pitch:设置观察地图的角度(以度为单位),即俯视角度。默认值为 0 度,表示垂直于地图表面观察。
    • zoom:所显示的地图的层级,数量越大,显示的范围越小。若为 0,则显示的是世界地图;本例中使用了 zoom=10,显示了我朝的“街道”和“镇”这一级的地图。当然,因为在网页中呈现的地图是具有交互性的,还可以通过扩大、缩小操作,实现呈现地图范围的变化。

在上述基础上,再用江苏省各城市数据,标记出各个城市的位置。

import pandas as pd

df = pd.read_csv("/Users/qiwsir/Documents/Codes/DataSet/jiangsu/city_population.csv")

mapbox_token = "your_mapbox_access_token"

lat = df.latd    # 经度(Longitude) 纬度(Latitude)
lon = df.longd
locations_name = df.name   # 城市名称

data = [
    go.Scattermapbox(
        lat = lat,
        lon = lon,
        mode = "markers",
        marker = dict(size=17, 
                      color='rgb(255, 0, 0)', 
                      opacity=0.7),  
        text = locations_name,
        hoverinfo = 'text',
    ),
    go.Scattermapbox(
        lat = lat,
        lon = lon,
        mode = "markers",
        marker = dict(size=8, 
                      color='rgb(242, 177, 172)', 
                      opacity=0.7),
        text = locations_name,
        hoverinfo = 'text'
    )
]

layout = go.Layout(
    title = "The City of Jiangsu",
    autosize = True,
    hovermode = "closest",
    showlegend = False,
    mapbox = dict(accesstoken=mapbox_token, 
                  bearing=0, 
                  center=dict(lat=31,lon=120),
                  pitch=0,
                  zoom=5,
                  style='light'),
)

fig = dict(data=data, layout=layout)
plotly.offline.plot(fig, filename="jiangsu_city_map")

输出结果局部效果:

enter image description here

4.4.2 金融数据可视化

金融领域对数据可视化有着非常迫切的需要,比如股票市场,常以多种可视化方式表示不同类别的数据,而这些数据通常都有一个重要的维度:时间——严格讲是时刻,只不过是不同单位罢了。

先看下面的示例(数据来源:https://github.com/qiwsir/DataSet/tree/master/appl)。

appl_df = pd.read_csv("/Users/qiwsir/Documents/Codes/DataSet/appl/appl.csv", 
                      index_col=['date'], parse_dates=['date'])
appl_df.head()

close volume open high low
date
2018-10-17 221.19 22692880 222.30 222.64 219.3400
2018-10-16 222.15 28802550 218.93 222.99 216.7627
2018-10-15 217.36 30280450 221.16 221.83 217.2700
2018-10-12 222.11 39494770 220.42 222.88 216.8400
2018-10-11 214.45 52902320 214.52 219.50 212.3200

读入数据的同时将“date”列指定为 DataFrame 的索引,并转化为日期类型。在输出结果中可以看到该数据的各个特征,且索引是按照日期“从大到小”排列的。

data = [go.Scatter(x=appl_df.index, y=appl_df['high'])]

plotly.offline.init_notebook_mode(connected=True)
plotly.offline.iplot(data)

输出结果:

enter image description here

这是用 go.Scatter 绘制的折线图,但是 Plotly 在处理 X 轴数据的时候很聪明,并没有按照 appl_df 中索引顺序直接在坐标系绘图(按照时间“从大到小”),而是自动进行翻转,按照时间“从小到大”的自然顺序绘制了每日的股票交易最高价折线图。为了观察到时间跨度更小的某个范围的价格变化,可以利用交互功能中的“放大”操作工具。

从 appl_df 的数据集中可知,股票数据中还有 close、open、low 等交易数值。要把这些也在图中表示出来,可以创建相应的 Trace 对象——这是以前讲过的方法。Plotly 中提供了专门用户绘制股票交易数据的类(也是 Trace 对象)。

trace = go.Ohlc(
    x = appl_df.index,
    open = appl_df.open,
    high = appl_df.high,
    low = appl_df.low,
    close = appl_df.close,
)

plotly.offline.iplot([trace])

输出结果:

enter image description here

这里使用了一个新的 Trace 类 go.Ohlc,其作用就是绘制股票的开盘价(open)、最高价(high)、最低价(low)和收盘价(close)——简称“ohlc”。

注意观察图示:

  • 图示中的线不是折线(貌似是因为数据量比较大的缘故)——后续会换一种数据研究图线。
  • 在 X 轴下面有专门的时间控件,通过它可以选择显示任意时间间隔内的统计图。而且,这个时间空间是自动生成的。

为了便于研究图线,取少量数据,还是绘制 OHLC 图。

df30 = appl_df.head(30)

trace = go.Ohlc(x = df30.index,
                open = df30.open,
                high = df30.high,
                low = df30.low,
                close = df30.close,
               )

plotly.offline.iplot([trace])

输出结果:

相关文章

网友评论

      本文标题:Python 数据可视化:高级制图案例剖析

      本文链接:https://www.haomeiwen.com/subject/jslebktx.html