【Python百日进阶-数据分析】Day227 - plotly的子图

news2024/12/23 23:55:15

文章目录

  • 一、Plotly 图形工厂子图
    • 1.1 垂直图形工厂图表
    • 1.2 水平表格和图表
    • 1.3 垂直表格和图表
  • 二、表格和图表子图
  • 三、地理子图
  • 四、混合子图和 Plotly Express

一、Plotly 图形工厂子图

Plotly 的 Python API 包含一个图形工厂模块,其中包含许多包装函数,这些函数创建了尚未包含在Plotly的开源图形库 plotly.js 中的独特图表类型。图形工厂函数创建一个完整的图形,因此一些 Plotly 功能,例如子图,应该与这些图表略有不同。

1.1 垂直图形工厂图表

import plotly.figure_factory as ff
import plotly.graph_objects as go

import numpy as np

## Create first figure
x1,y1 = np.meshgrid(np.arange(0, 2, .2), np.arange(0, 2, .2))
u1 = np.cos(x1)*y1
v1 = np.sin(x1)*y1

fig1 = ff.create_quiver(x1, y1, u1, v1, name='Quiver')

## Create second figure
x = np.linspace(-3, 3, 100)
y = np.linspace(-3, 3, 100)
Y, X = np.meshgrid(x, y)
u = -1 - X**2 + Y
v = 1 + X - Y**2

fig2 = ff.create_streamline(x, y, u, v, arrow_scale=.1, name='Steamline')

for i in range(len(fig1.data)):
    fig1.data[i].xaxis='x1'
    fig1.data[i].yaxis='y1'

fig1.layout.xaxis1.update({'anchor': 'y1'})
fig1.layout.yaxis1.update({'anchor': 'x1', 'domain': [.55, 1]})

for i in range(len(fig2.data)):
    fig2.data[i].xaxis='x2'
    fig2.data[i].yaxis='y2'

# initialize xaxis2 and yaxis2
fig2['layout']['xaxis2'] = {}
fig2['layout']['yaxis2'] = {}

fig2.layout.xaxis2.update({'anchor': 'y2'})
fig2.layout.yaxis2.update({'anchor': 'x2', 'domain': [0, .45]})

fig = go.Figure()
fig.add_traces([fig1.data[0], fig2.data[0]])

fig.layout.update(fig1.layout)
fig.layout.update(fig2.layout)

fig.show()

在这里插入图片描述

1.2 水平表格和图表

import plotly.graph_objects as go
import plotly.figure_factory as ff

table_data = [['Team', 'Wins', 'Losses', 'Ties'],
              ['Montréal<br>Canadiens', 18, 4, 0],
              ['Dallas Stars', 18, 5, 0],
              ['NY Rangers', 16, 5, 0],
              ['Boston<br>Bruins', 13, 8, 0],
              ['Chicago<br>Blackhawks', 13, 8, 0],
              ['LA Kings', 13, 8, 0],
              ['Ottawa<br>Senators', 12, 5, 0]]

fig = ff.create_table(table_data, height_constant=60)

teams = ['Montréal Canadiens', 'Dallas Stars', 'NY Rangers',
         'Boston Bruins', 'Chicago Blackhawks', 'LA Kings', 'Ottawa Senators']
GFPG = [3.54, 3.48, 3.0, 3.27, 2.83, 2.45, 3.18]
GAPG = [2.17, 2.57, 2.0, 2.91, 2.57, 2.14, 2.77]

trace1 = go.Scatter(x=teams, y=GFPG,
                    marker=dict(color='#0099ff'),
                    name='目标<br>每场比赛的进球数',
                    xaxis='x2', yaxis='y2')
trace2 = go.Scatter(x=teams, y=GAPG,
                    marker=dict(color='#404040'),
                    name='进球<br>每场比赛对',
                    xaxis='x2', yaxis='y2')

fig.add_traces([trace1, trace2])

# 初始化xaxis2和yaxis2
fig['layout']['xaxis2'] = {}
fig['layout']['yaxis2'] = {}

# 编辑子地块的布局
fig.layout.xaxis.update({'domain': [0, .5]})
fig.layout.xaxis2.update({'domain': [0.6, 1.]})

# 图形的坐标轴必须锚定到图形的坐标轴
fig.layout.yaxis2.update({'anchor': 'x2'})
fig.layout.yaxis2.update({'title': '目标'})

# 更新页边距以添加标题,并查看图表x标签。
fig.layout.margin.update({'t':50, 'b':100})
fig.layout.update({'title': '2016年曲棍球统计数据'})

fig.show()

在这里插入图片描述

1.3 垂直表格和图表

import plotly.graph_objects as go
import plotly.figure_factory as ff

# 添加表数据
table_data = [['Team', 'Wins', 'Losses', 'Ties'],
              ['Montréal<br>Canadiens', 18, 4, 0],
              ['Dallas Stars', 18, 5, 0],
              ['NY Rangers', 16, 5, 0],
              ['Boston<br>Bruins', 13, 8, 0],
              ['Chicago<br>Blackhawks', 13, 8, 0],
              ['Ottawa<br>Senators', 12, 5, 0]]

# 用ff初始化图形。创建表格(表格数据)
fig = ff.create_table(table_data, height_constant=60)

# 添加图形数据
teams = ['Montréal Canadiens', 'Dallas Stars', 'NY Rangers',
         'Boston Bruins', 'Chicago Blackhawks', 'Ottawa Senators']
GFPG = [3.54, 3.48, 3.0, 3.27, 2.83, 3.18]
GAPG = [2.17, 2.57, 2.0, 2.91, 2.57, 2.77]

# 为图形绘制轨迹
trace1 = go.Bar(x=teams, y=GFPG, xaxis='x2', yaxis='y2',
                marker=dict(color='#0099ff'),
                name='进球<br>Per Game')
trace2 = go.Bar(x=teams, y=GAPG, xaxis='x2', yaxis='y2',
                marker=dict(color='#404040'),
                name='进球对抗<br>Per Game')

# 将跟踪数据添加到图中
fig.add_traces([trace1, trace2])

# 初始化xaxis2和yaxis2
fig['layout']['xaxis2'] = {}
fig['layout']['yaxis2'] = {}

# 编辑子地块的布局
fig.layout.yaxis.update({'domain': [0, .45]})
fig.layout.yaxis2.update({'domain': [.6, 1]})

# 图形的yaxis2必须锚定到图形的xaxis2,反之亦然
fig.layout.yaxis2.update({'anchor': 'x2'})
fig.layout.xaxis2.update({'anchor': 'y2'})
fig.layout.yaxis2.update({'title': 'Goals'})

# 更新页边距以添加标题,并查看图表x标签。
fig.layout.margin.update({'t':75, 'l':50})
fig.layout.update({'title': '2016 Hockey Stats'})

# 更新高度,因为垂直添加图形将与为表格计算的打印高度交互
fig.layout.update({'height':800})

# Plot!
fig.show()

在这里插入图片描述

二、表格和图表子图

import plotly.graph_objects as go
from plotly.subplots import make_subplots

import pandas as pd
import re
# "https://raw.githubusercontent.com/plotly/datasets/master/Mining-BTC-180.csv"
df = pd.read_csv("F:/Mining-BTC-180.csv")

for i, row in enumerate(df["Date"]):
    p = re.compile(" 00:00:00")
    datetime = p.split(df["Date"][i])[0]
    df.iloc[i, 1] = datetime

fig = make_subplots(
    rows=3, cols=1,
    shared_xaxes=True,
    vertical_spacing=0.03,
    specs=[[{"type": "table"}],
           [{"type": "scatter"}],
           [{"type": "scatter"}]]
)

fig.add_trace(
    go.Scatter(
        x=df["Date"],
        y=df["Mining-revenue-USD"],
        mode="lines",
        name="mining revenue"
    ),
    row=3, col=1
)

fig.add_trace(
    go.Scatter(
        x=df["Date"],
        y=df["Hash-rate"],
        mode="lines",
        name="hash-rate-TH/s"
    ),
    row=2, col=1
)

fig.add_trace(
    go.Table(
        header=dict(
            values=["Date", "Number<br>Transactions", "Output<br>Volume (BTC)",
                    "Market<br>Price", "Hash<br>Rate", "Cost per<br>trans-USD",
                    "Mining<br>Revenue-USD", "Trasaction<br>fees-BTC"],
            font=dict(size=10),
            align="left"
        ),
        cells=dict(
            values=[df[k].tolist() for k in df.columns[1:]],
            align = "left")
    ),
    row=1, col=1
)
fig.update_layout(
    height=800,
    showlegend=False,
    title_text="比特币开采统计数据持续180天",
)

fig.show()

在这里插入图片描述

三、地理子图

import plotly.graph_objects as go
import pandas as pd
# "https://raw.githubusercontent.com/plotly/datasets/master/1962_2006_walmart_store_openings.csv"
df = pd.read_csv('f:/1962_2006_walmart_store_openings.csv')
df.head()

data = []
layout = dict(
    title = '1962-2006年沃尔玛每年新增门店<br>\
Source: <a href="http://www.econ.umn.edu/~holmes/data/WalMart/index.html">\
University of Minnesota</a>',
    # showlegend = False,
    autosize = False,
    width = 1000,
    height = 900,
    hovermode = False,
    legend = dict(
        x=0.7,
        y=-0.1,
        bgcolor="rgba(255, 255, 255, 0)",
        font = dict( size=11 ),
    )
)
years = df['YEAR'].unique()

for i in range(len(years)):
    geo_key = 'geo'+str(i+1) if i != 0 else 'geo'
    lons = list(df[ df['YEAR'] == years[i] ]['LON'])
    lats = list(df[ df['YEAR'] == years[i] ]['LAT'])
    # 沃尔玛商店数据
    data.append(
        dict(
            type = 'scattergeo',
            showlegend=False,
            lon = lons,
            lat = lats,
            geo = geo_key,
            name = int(years[i]),
            marker = dict(
                color = "rgb(0, 0, 255)",
                opacity = 0.5
            )
        )
    )
    # Year markers
    data.append(
        dict(
            type = 'scattergeo',
            showlegend = False,
            lon = [-78],
            lat = [47],
            geo = geo_key,
            text = [years[i]],
            mode = 'text',
        )
    )
    layout[geo_key] = dict(
        scope = 'usa',
        showland = True,
        landcolor = 'rgb(229, 229, 229)',
        showcountries = False,
        domain = dict( x = [], y = [] ),
        subunitcolor = "rgb(255, 255, 255)",
    )


def draw_sparkline( domain, lataxis, lonaxis ):
    ''' 返回地理坐标的迷你图布局对象  '''
    return dict(
        showland = False,
        showframe = False,
        showcountries = False,
        showcoastlines = False,
        domain = domain,
        lataxis = lataxis,
        lonaxis = lonaxis,
        bgcolor = 'rgba(255,200,200,0.0)'
    )

# 每年的店数
layout['geo44'] = draw_sparkline({'x':[0.6,0.8], 'y':[0,0.15]}, \
                                 {'range':[-5.0, 30.0]}, {'range':[0.0, 40.0]} )
data.append(
    dict(
        type = 'scattergeo',
        mode = 'lines',
        lat = list(df.groupby(by=['YEAR']).count()['storenum']/1e1),
        lon = list(range(len(df.groupby(by=['YEAR']).count()['storenum']/1e1))),
        line = dict( color = "rgb(0, 0, 255)" ),
        name = "每年新店<br>1990年达到每年178家店的峰值",
        geo = 'geo44',
    )
)

# Cumulative sum sparkline
layout['geo45'] = draw_sparkline({'x':[0.8,1], 'y':[0,0.15]}, \
                                 {'range':[-5.0, 50.0]}, {'range':[0.0, 50.0]} )
data.append(
    dict(
        type = 'scattergeo',
        mode = 'lines',
        lat = list(df.groupby(by=['YEAR']).count().cumsum()['storenum']/1e2),
        lon = list(range(len(df.groupby(by=['YEAR']).count()['storenum']/1e1))),
        line = dict( color = "rgb(214, 39, 40)" ),
        name ="2006年累计门店总数为3176家",
        geo = 'geo45',
    )
)

z = 0
COLS = 5
ROWS = 9
for y in reversed(range(ROWS)):
    for x in range(COLS):
        geo_key = 'geo'+str(z+1) if z != 0 else 'geo'
        layout[geo_key]['domain']['x'] = [float(x)/float(COLS), float(x+1)/float(COLS)]
        layout[geo_key]['domain']['y'] = [float(y)/float(ROWS), float(y+1)/float(ROWS)]
        z=z+1
        if z > 42:
            break

fig = go.Figure(data=data, layout=layout)
fig.update_layout(width=800)
fig.show()

在这里插入图片描述

四、混合子图和 Plotly Express

Plotly Express是 Plotly 的易于使用的高级界面,它对各种类型的数据进行操作并生成易于样式化的图形。

注意:目前,Plotly Express 不支持创建具有任意混合子图的图形,即具有不同类型子图的图形。Plotly Express 仅支持构面图和边际分布子图。要制作具有混合子图的图形,请将该make_subplots()函数与图形对象结合使用,如下所述。

import plotly.graph_objects as go
from plotly.subplots import make_subplots

import pandas as pd

# read in volcano database data
# "https://raw.githubusercontent.com/plotly/datasets/master/volcano_db.csv"
df = pd.read_csv(
    "f:/volcano_db.csv",
    encoding="iso-8859-1",
)

# frequency of Country
freq = df
freq = freq.Country.value_counts().reset_index().rename(columns={"index": "x"})

# read in 3d volcano surface data
# "https://raw.githubusercontent.com/plotly/datasets/master/volcano.csv"
df_v = pd.read_csv("f:/volcano.csv")

# Initialize figure with subplots
fig = make_subplots(
    rows=2, cols=2,
    column_widths=[0.6, 0.4],
    row_heights=[0.4, 0.6],
    specs=[[{"type": "scattergeo", "rowspan": 2}, {"type": "bar"}],
           [            None                    , {"type": "surface"}]])

# Add scattergeo globe map of volcano locations
fig.add_trace(
    go.Scattergeo(lat=df["Latitude"],
                  lon=df["Longitude"],
                  mode="markers",
                  hoverinfo="text",
                  showlegend=False,
                  marker=dict(color="crimson", size=4, opacity=0.8)),
    row=1, col=1
)

# Add locations bar chart
fig.add_trace(
    go.Bar(x=freq["x"][0:10],y=freq["Country"][0:10], marker=dict(color="crimson"), showlegend=False),
    row=1, col=2
)

# Add 3d surface of volcano
fig.add_trace(
    go.Surface(z=df_v.values.tolist(), showscale=False),
    row=2, col=2
)

# Update geo subplot properties
fig.update_geos(
    projection_type="orthographic",
    landcolor="white",
    oceancolor="MidnightBlue",
    showocean=True,
    lakecolor="LightBlue"
)

# Rotate x-axis labels
fig.update_xaxes(tickangle=45)

# Set theme, margin, and annotation in layout
fig.update_layout(
    template="plotly_dark",
    margin=dict(r=10, t=25, b=40, l=60),
    annotations=[
        dict(
            text="Source: NOAA",
            showarrow=False,
            xref="paper",
            yref="paper",
            x=0,
            y=0)
    ]
)

fig.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/168999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可执行文件的装载

装载方式回顾一下操作系统的知识&#xff0c;程序执行的时候需要的指令和数级都必须在内存中时&#xff0c;程序才能正常运行&#xff0c;最简单的方式就是将指令和数级全部加载到内存中&#xff0c;这样肯定可以顺利执行&#xff0c;但这样的方式对内存大小来说是一个考验。因…

python中的socket网络编程

目录 一.服务端开发 1.什么是Socket网络编程 2.基于Socket完成服务端程序开发 步骤 演示 二.客户端开发 步骤 演示 一.服务端开发 1.什么是Socket网络编程 socket(简称套接字)是进程之间通信一个工具&#xff0c;好比现实生活中的插座,所有的家用电器要想工作都是基于…

Git系列:入门必备指令详解

Git系列&#xff1a;入门必备指令详解总览高频指令参考资料总览 常用指令使用流程如下图&#xff1a; workspace&#xff1a;工作区staging area&#xff1a;暂存区/缓存区local repository&#xff1a;版本库或本地仓库remote repository&#xff1a;远程仓库 ——引用自&…

线程学习笔记

线程 出现原因 MP3多个模块放在一个进程中&#xff0c;CPU处理能力&#xff0c;播放可能不连续&#xff1b;放在多个进程中&#xff0c;资源传递、进程维护等开销很大 进程相比于进程&#xff0c;地址空间直接共享 定义 线程是进程的执行流程&#xff0c;除了线程&#xf…

WPF之调用Iconfont

一、调用iconfont 1、首先再Iconfont中新建一个项目&#xff0c;注意修改font family 2、将在线的icon添加到项目中 3、下载安装包到本地 4、更改本地的fontfamily格式如下‘./路径文件夹名/#***’ ***是指再iconfont中的fontfamily 注意如果显示为口 可能是路径不对 如果…

数据结构——栈和队列

目录 一、栈&#xff08;Stack&#xff09; 1、定义 2、顺序结构模拟实现栈和常用方法 &#xff08;1&#xff09;.栈的顺序存储 &#xff08;2&#xff09;.基本方法 3、栈的链式结构与顺序结构对比 &#xff08;1&#xff09;.对比 4、区分概念 &#xff08;1&#x…

JavaScript 库之 vanilla-tilt(一个平滑的 3D 倾斜库)

JavaScript 库之 vanilla-tilt&#xff08;一个平滑的 3D 倾斜库&#xff09;参考获取vanilla-tilt特点使用示例使用1. data-tilt2. VanillaTilt.init()优先级示例配置选项其他参考 项目描述GitHub前往Vanilla-tilt.js前往 获取 Vanilla-tilt.jsGitHubnpm npm install vanil…

【开发环境】JRE 裁剪 ② ( 裁剪 bin 目录下的 dll 动态库文件 | 压缩 rt.jar 文件 )

文章目录一、裁剪 lib 目录下的 jar 文件二、压缩 rt.jar 文件参考博客 : 精简jre1.8精简jre步骤裁剪JRE(嵌入式设备的java环境移植) 资源下载地址 ( 本篇博客的资源快照 , 不是最终版的裁剪效果 ) : https://download.csdn.net/download/han1202012/87389091 JRE 裁剪分为三…

Pytorch深度学习【十五】

微调 网络架构 一个神经网络一般可以分成两块 特征抽取将原始像素变成容易线性分割的特征线性分类器来做分类 微调 思路—将相同功能的网络及其参数直接进行迁移使用&#xff0c;而并不是通过重新学习&#xff0c;只改变部分层次即可 训练 是一个目标数据集上的正常训练任务…

老杨说运维 | 2023,浅谈智能运维趋势(二)

&#xff08;文末附视频&#xff0c;一键观看精彩内容&#xff09; 前言&#xff1a; 上文提到了智能运维现状中的变化趋势以及 上文提到了智能运维现状中的变化趋势以及过往误区&#xff0c;老杨认为智能运维的体系化建设还需从抓牢数据治理为起点&#xff0c;以终为始做好规…

miniconda虚拟环境安装使用jupyter notebook及相关

一、安装jupyter 1创建miniconda虚拟环境。&#xff08;前面文章讲过了&#xff09; 2在创建的虚拟环境下&#xff0c;conda install ipython jupyter 3在该环境下执行jupyter notebook。 注意&#xff1a;此时打开的jupyter notebook内核Python 3(ipykernel)对应该虚拟环境&am…

数据安全治理 1

数据安全治理应以数据为中心&#xff0c;多元化主体共同参与&#xff0c;兼顾发展与安全。 数据安全总体视图&#xff0c;包含了体系&#xff0c;维度&#xff0c;目标&#xff0c;实践。 制度建设 技术体系&#xff0c;如加密、脱敏等手段&#xff0c;进行数据全生命周期的管…

盘点:2022年豆瓣评分8.0以上的计算机书籍有哪些?

2022年已经结束 &#xff0c;小编来盘点一下过去一年里出版的计算机图书里&#xff0c;有哪些计算机书籍是豆瓣评分8.0以上图书。 1、人工智能&#xff1a;现代方法&#xff08;第4版&#xff09;&#xff08;上下册&#xff09; ​ 系统性总结人工智能的方方面面&#xff0c;…

寒假每日一题2023——4261. 孤独的照片

写在前面 题目来源&#xff1a;AcWing 寒假每日一题2023活动 链接&#xff1a;https://www.acwing.com/problem/content/description/4264/ 题目 Farmer John 最近购入了 N 头新的奶牛&#xff0c;每头奶牛的品种是更赛牛&#xff08;Guernsey&#xff09;或荷斯坦牛&#x…

论文解读12——NGBoost: Natural Gradient Boosting for Probabilistic Prediction

目录1、文章贡献2、评分规则3、自然梯度4、自然梯度提升算法NGBoost1、文章贡献 由吴恩达团队提出的NGBoost是一种通过梯度提升进行概率预测的算法&#xff0c;与经典的回归模型返回一个点估计结果不同&#xff0c;概率回归模型返回全概率分布&#xff0c;将条件分布的参数视为…

Windows系统安装jenkins服务 war包形式

1.首先下载 jenkins war包 注意和jdk 的版本匹配 https://www.jenkins.io/zh/download/ 2.配置jenkins环境变量 如果不配置环境变量, jenkins的主目录默认生成在c盘下 环境变量怎么配? 请自行百度 3.运行jar包 注意修改war包路径 java -jar /data/jenkins/jenkins.war…

DNS原理与搭建(一)

文章目录一、DNS的概念与原理二、DNS私服搭建一、DNS的概念与原理 概念 DNS指的是域名服务器&#xff0c;就是将域名转换成IP[或者将IP转换成域名];当我们在浏览器中输入域名并按下回车&#xff0c;会对我们输入的域名进行解析&#xff0c;并返回一个IP地址&#xff0c;在通过…

Deepin系统深度学习环境配置指南

Deepin深度操作系统在众多Linux发行版本中深受欢迎&#xff0c;在实用性和专业方面到达了很好的均衡&#xff0c;该系统软件适配丰富支持很多第三方软件&#xff0c;增加了系统任务的灵活性。在装好该系统后&#xff0c;如何在该系统上进行深度学习代码训练调试&#xff0c;这就…

网络编程.

文章目录一、概述通信要素一&#xff1a;IP和端口号IP端口号通信要素二&#xff1a;网络协议TCP网络编程UDP网络编程URL网络编程每日一考一、概述 1、网络编程中两个主要问题&#xff1a; 如何定位网上的一台或多台主机&#xff0c;定位主机上的特定应用 找到主机后&#xff0…

北京化工大学1/17寒假集训题解(>1800)

目录 A - 文艺平衡树 B - 可持久化文艺平衡树 C - 可持久化平衡树 主要思路&#xff1a;FHQ Treap 可持久化 D - 维护数列 初始化 Insert操作 Delete操作 Reverse操作 Make-Same操作 Get-Sum操作 Max-Sum操作 懒标记的处理 E - 文本编辑器 A - 文艺平衡树 这里的…