python用plotly实现绘制局部放大图

目录
  • 最终效果展示
  • 实现思路
  • 导入库
  • 随机生成一些数据
  • 封装绘图代码
  • 开始绘制
  • 总结

最终效果展示

实现思路

在绘图区域插入一个嵌入图,嵌入图与原图的绘画保持一致,通过限制嵌入图的x轴和y轴的显示范围,达到缩放的效果,并在原图上绘画一个矩形框,以凸显缩放的区域,最后通过两条直线凸显缩放关系。

导入库

import plotly.io as pio
import plotly.graph_objects as go
import pandas as pd
import numpy as np

# 设置plotly默认主题,白色主题
pio.templates.default = 'plotly_white'

随机生成一些数据

# x坐标
x = np.arange(1, 1001)

# 生成y轴数据,并添加随机波动
y1 = np.log(x)
indexs = np.random.randint(0, 1000, 800)
for index in indexs:
    y1[index] += np.random.rand() - 0.5
y1 = y1 + 0.2

y2 = np.log(x)
indexs = np.random.randint(0, 1000, 800)
for index in indexs:
    y2[index] += np.random.rand() - 0.5

y3 = np.log(x)
indexs = np.random.randint(0, 1000, 800)
for index in indexs:
    y3[index] += np.random.rand() - 0.5
y3 = y3 - 0.2

封装绘图代码

class LocalZoomPlot:
    def __init__(self, x, y, colors, x_range, scale=0.):
        """
        :param x: x轴坐标,列表类型
        :param y: y轴坐标,二维列表类型,例如 [y1, y2, y3]
        :param colors: 每个曲线的颜色,必须与 len(y) 相等
        :param x_range: 需要缩放区域的x轴范围
        :param scale: 详见 getRangeMinMaxValue 函数
        """
        self.x = x
        self.y = y
        self.colors = colors
        self.x_range = x_range
        self.y_range = self.getRangeMinMaxValue(x_range, scale)

    def getRangeMinMaxValue(self, x_range, scale=0.):
        """
        获取指定x轴范围内,所有y数据的最大值和最小值

        :param x_range: 期望局部放大的x轴范围
        :param scale: 将最大值和最小值向两侧延伸一定距离
        """
        min_value = np.min([np.min(arr[x_range[0]:x_range[1]]) for arr in self.y])
        max_value = np.max([np.max(arr[x_range[0]:x_range[1]]) for arr in self.y])
        # 按一定比例缩放
        min_value = min_value - (max_value - min_value) * scale
        max_value = max_value + (max_value - min_value) * scale
        # 返回缩放后的结果
        return min_value, max_value

    def originPlot(self, fig, **kwargs):
        """
        根据 y 数据绘制初始折线图

        :param fig: go.Figure实例
        """
        fig.add_traces([
            go.Scatter(x=self.x, y=arr, opacity=0.7, marker_color=self.colors[i], **kwargs)
            for i, arr in enumerate(self.y)
        ])
        return fig

    def insetPlot(self, fig, inset_axes):
        """
        在原始图像上插入嵌入图

        :param fig: go.Figure对象实例
        :param inset_axes: 嵌入图的位置和大小 [左下角的x轴位置, 左下角的y轴位置, 宽度, 高度]
          所有坐标都是绝对坐标(0~1之间)
        """
        # 使用创建子图中的嵌入图参数,创建一个嵌入图
        fig = fig.set_subplots(insets=[dict(
            type='xy',
            l=inset_axes[0], b=inset_axes[1],
            w=inset_axes[2], h=inset_axes[3],
        )])
	    # 嵌入图与原始图的绘画一致,需要指定 xaxis 和 yaxis 参数确保是在嵌入图上绘画的
        fig = self.originPlot(fig, xaxis='x2', yaxis='y2', showlegend=False)
        # 将嵌入图的坐标轴范围限定在指定范围
        fig.update_layout(
            xaxis2=dict(range=self.x_range),
            yaxis2=dict(range=self.y_range)
        )
        return fig

    def rectOriginArea(self, fig):
        """
        将放大的区域框起来

        :param fig: go.Figure实例
        """
        fig.add_trace(go.Scatter(
        	# 从左上角开始,顺时针连线
            x=np.array(self.x_range)[[0, 1, 1, 0, 0]],
            y=np.array(self.y_range)[[1, 1, 0, 0, 1]],
            mode='lines',
            line={'color': '#737473', 'dash': 'dash', 'width': 3},
            showlegend=False
        ))
        return fig

    def addConnectLine(self, fig, area_point_num, point):
        """
        从放大区域指定点连线

        :param fig: go.Figure实例
        :param area_point_num: 放大区域的锚点,例如:(0, 0)表示放大区域的左下角坐标,(0, 1)表示左上角坐标,
          (1, 0)表示右下角坐标,(1, 1)表示右上角坐标,只能取这四种情况
        :param point: 要进行连线的另一个点,通常位于嵌入图附近,根据美观程度自行指定
        """
        fig.add_shape(type='line',
            x0=self.x_range[area_point_num[0]],
            y0=self.y_range[area_point_num[1]],
            x1=point[0], y1=point[1],
            line={'color': '#737473', 'dash': 'dash', 'width': 1},
        )
        return fig

开始绘制

plot = LocalZoomPlot(x, [y1, y2, y3], ['#f0bc94', '#7fe2b3', '#cba0e6'], (100, 150), 0.)
fig = go.Figure()

fig = plot.originPlot(fig)
fig = plot.insetPlot(fig, (0.4, 0.2, 0.4, 0.3))
fig = plot.rectOriginArea(fig)
fig = plot.addConnectLine(fig, (0, 0), (420, -0.7))
fig = plot.addConnectLine(fig, (1, 1), (900, 2.7))

# 额外对图片进行设置
fig.update_layout(
    width=800, height=600,
    xaxis=dict(
        rangemode='tozero',
        showgrid=False,
        zeroline=False,
    ),
    xaxis2=dict(
        showgrid=False,
        zeroline=False
    ),
)

fig.show()

总结

到此这篇关于python用plotly实现绘制局部放大图的文章就介绍到这了,更多相关python plotly绘制局部放大图内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 最强Python可视化绘图库Plotly详解用法

    今天给大家分享一篇可视化干货,介绍的是功能强大的开源 Python 绘图库 Plotly,教你如何用超简单的(甚至只要一行)代码,绘制出更棒的图表. 我之前一直使用 matplotlib ,由于它复杂的语法,我已经"沉没"在里面太多的时间成本.这也导致我花费了不知多少个深夜,在 StackOverflow 上搜索如何"格式化日期"或"增加第二个Y轴". 但我们现在有一个更好的选择了 ,比如易于使用.文档健全.功能强大的开源 Python 绘图库

  • python Plotly绘图工具的简单使用

    1.plotly库的相关介绍 1)相关说明 plotly是一个基于javascript的绘图库,plotly绘图种类丰富,效果美观: 易于保存与分享plotly的绘图结果,并且可以与Web无缝集成: ploty默认的绘图结果,是一个HTML网页文件,通过浏览器可以直接查看: 2)plotly与matplotlib.seaborn的关系   需要注意的是,ployly绘图库与matplotlib绘图库.seaborn绘图库并没有什么关系.也就是说说plotly是一个单独的绘图库,有自己独特的绘图语

  • python使用Plotly绘图工具绘制柱状图

    本文实例为大家分享了python使用Plotly绘图工具绘制柱状图的具体代码,供大家参考,具体内容如下 使用Plotly绘制基本的柱状图,需要用到的函数是graph_objs 中 Bar函数 通过参数,可以设置柱状图的样式. 通过barmod进行设置可以绘制出不同类型的柱状图出来. 我们先来实现一个简单的柱状图: # -*- coding: utf-8 -*- import plotly as py import plotly.graph_objs as go pyplt = py.offlin

  • python使用Plotly绘图工具绘制气泡图

    今天来讲讲如何使用Python 绘图工具,Plotly来绘制气泡图. 气泡图的实现方法类似散点图的实现.修改散点图中点的大小,就变成气泡图. 实现代码如下: import plotly as py import plotly.graph_objs as go pyplt = py.offline.plot trace0 = go.Scatter( x=[1, 2, 3, 4, 5, 6, 7], y=[8, 10, 12, 14, 16, 18, 20], mode='markers', mar

  • python用plotly实现绘制局部放大图

    目录 最终效果展示 实现思路 导入库 随机生成一些数据 封装绘图代码 开始绘制 总结 最终效果展示 实现思路 在绘图区域插入一个嵌入图,嵌入图与原图的绘画保持一致,通过限制嵌入图的x轴和y轴的显示范围,达到缩放的效果,并在原图上绘画一个矩形框,以凸显缩放的区域,最后通过两条直线凸显缩放关系. 导入库 import plotly.io as pio import plotly.graph_objects as go import pandas as pd import numpy as np #

  • Python使用plotly绘制数据图表的方法

    导语:使用 python-plotly 模块来进行压测数据的绘制,并且生成静态 html 页面结果展示. 不少小伙伴在开发过程中都有对模块进行压测的经历,压测结束后大家往往喜欢使用Excel处理压测数据并绘制数据可视化视图,但这样不能很方便的使用web页面进行数据展示.本文将介绍使用python-plotly模块来进行压测数据的绘制,并且生成静态html页面方便结果展示. Plotly简介 Plotly是一款使用JavaScript开发的制图工具,提供了与主流数据分析语言交互的API(如:Pyt

  • 详解Python使用Plotly绘图工具,绘制甘特图

    今天来讲一下如何使用Python 的绘图工具Plotly来绘制甘特图的方法 甘特图大家应该了解熟悉,就是通过条形来显示项目的进度.时间安排等相关情况的. 我们今天来学习一下,如何使用ployly来绘制甘特图 绘制甘特图的函数为Plotly.figure_factoryz中create_gantt方法 通过参数事件Task,开始Start,结束Finish的时间的数据来绘制甘特图 import plotly as py import plotly.figure_factory as ff pypl

  • Python使用Plotly绘制常见5种动态交互式图表

    目录 启动 动画 太阳图 平行类别 平行坐标图 量表图和指示器 数据可以帮助我们描述这个世界.阐释自己的想法和展示自己的成果,但如果只有单调乏味的文本和数字,我们却往往能难抓住观众的眼球.而很多时候,一张漂亮的可视化图表就足以胜过千言万语.本文将介绍 5 种基于 Plotly 的可视化方法,你会发现,原来可视化不仅可用直方图和箱形图,还能做得如此动态好看甚至可交互. 对数据科学家来说,讲故事是一个至关重要的技能.为了表达我们的思想并且说服别人,我们需要有效的沟通.而漂漂亮亮的可视化是完成这一任务

  • Python matplotlib plotly绘制图表详解

    目录 一.整理数据 二.折线图 三.散点图 四.饼图 五.柱形图 六.点图(设置多个go对象) 七.2D密度图 八.简单3D图 一.整理数据 以300部电影作为数据源 import pandas as pd cnboo=pd.read_excel("cnboNPPD1.xls") cnboo import seaborn as sns import numpy as np import matplotlib as mpl from matplotlib import pyplot as

  • Python利用plotly绘制正二十面体详解

    目录 顶点 棱 实现正二十面体 plotly 的 Python 软件包是一个开源的代码库,它基于 plot.js,而后者基于 d3.js.我们实际使用的则是一个对 plotly 进行封装的库,名叫 cufflinks,能让你更方便地使用 plotly 和 Pandas 数据表协同工作. 一言以蔽之,plotly是一款擅长交互的Python绘图库,下面就初步使用一下这个库的三维绘图功能.此前曾经用matplotlib画了正二十面体和足球:Python绘制正二十面体:画足球,这次用plotly复现一

  • python读取mysql数据绘制条形图

    本文实例为大家分享了python读取mysql数据绘制条形图的具体代码,供大家参考,具体内容如下 Mysql 脚本示例: create table demo( id int ,product varchar(50) ,price decimal(18,2) ,quantity int ,amount decimal(18,2) ,orderdate datetime ); insert into demo select 1,'AAA',15.2,5,76,'2017-09-09' union a

  • Python使用Turtle模块绘制五星红旗代码示例

    在Udacity上课时学到了python的turtle方法,这是一个很经典的用来教小孩儿编程的图形模块,最早起源于logo语言.python本身内置了这个模块,其可视化的方法可以帮助小孩儿对编程的一些基本理念有所理解. 在作业提交的论坛里看到很多turtle画出来的精美图形,想不出什么要画的东西,于是决定拿五星红旗来练练手. 前期准备 五星红旗绘制参数 Turtle官方文档 turtle的基本操作 # 初始化屏幕 window = turtle.Screen() # 新建turtle对象实例 i

随机推荐