返回顶部
首页 > 资讯 > 后端开发 > Python >python用plotly实现绘制局部放大图
  • 166
分享到

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

2024-04-02 19:04:59 166人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录最终效果展示实现思路导入库随机生成一些数据封装绘图代码开始绘制总结最终效果展示 实现思路 在绘图区域插入一个嵌入图,嵌入图与原图的绘画保持一致,通过限制嵌入图的x轴和y轴的显示

最终效果展示

在这里插入图片描述

实现思路

在绘图区域插入一个嵌入图,嵌入图与原图的绘画保持一致,通过限制嵌入图的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绘制局部放大图内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python用plotly实现绘制局部放大图

本文链接: https://lsjlt.com/news/138984.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python用plotly实现绘制局部放大图
    目录最终效果展示实现思路导入库随机生成一些数据封装绘图代码开始绘制总结最终效果展示 实现思路 在绘图区域插入一个嵌入图,嵌入图与原图的绘画保持一致,通过限制嵌入图的x轴和y轴的显示...
    99+
    2024-04-02
  • python怎么用plotly实现绘制局部放大图
    这篇文章将为大家详细讲解有关python怎么用plotly实现绘制局部放大图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最终效果展示实现思路在绘图区域插入一个嵌入图,嵌入图与原图的绘画保持一致,通过限制...
    99+
    2023-06-29
  • matlab绘制局部放大图
    先给出一个普通图代码: N=20000;i=1:1:N;a=sqrt(100)*randn(1,N/4);b=randn(1,N);c=[a,b];h1=plot(i,c(i),':.m','Line...
    99+
    2023-08-31
    matlab 开发语言 python
  • python实现局部图像放大
    本文实例为大家分享了python实现局部图像放大的具体代码,供大家参考,具体内容如下 import cv2 as cv import sys if __name__ == '_...
    99+
    2024-04-02
  • 怎么用Python matplotlib plotly绘制图表
    这篇文章主要讲解了“怎么用Python matplotlib plotly绘制图表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python matplo...
    99+
    2023-06-29
  • python opencv画局部放大图实例教程
    目录为什么要画局部放大图?程序逻辑程序实例总结这项功能的目的是为了方便使用opencv做图像标注工具。 为什么要画局部放大图? 在做图像数据标注时,很难一次就做到精准标注,经常需要...
    99+
    2024-04-02
  • jquery实现淘宝商品图片局部放大
    本篇博文用于简单记录图片放大功能实现,供大家参考,具体内容如下 功能实现还存在一些小漏洞在文章结尾提出,希望各位指正 1、图片放大初考虑将图片转换为字体图片形式,然后进行放大处理,但...
    99+
    2024-04-02
  • python+opencv实现论文插图局部放大并拼接效果
    目录前言cv2.rectangle()函数cv2.resize()函数np.hstack()和np.vstack()函数实现局部框定放大拼接总结前言 在制作论文插图时,有时要求将图片...
    99+
    2024-04-02
  • JavaScript实现淘宝网图片的局部放大功能
    本文实例为大家分享了JavaScript实现淘宝网图片的局部放大的具体代码,供大家参考,具体内容如下 要实现的效果如下: <!DOCTYPE html> <htm...
    99+
    2024-04-02
  • 使用matplotlib库实现图形局部数据放大显示的实践
    目录一、绘制总体图形二、插入局部子坐标系三、限制局部子坐标系数据范围四、加上方框和连接线五、总体实现代码一、绘制总体图形 import numpy as np import matp...
    99+
    2024-04-02
  • JavaScript实现购物车图片局部放大预览效果
    目录一、实现效果二、代码实现三、获取像素信息跨域问题怎么解决四、总结与思考一、实现效果 二、代码实现 代码不多,先看一下 HTML 里面结构很简单,初始化 MagnifyingGl...
    99+
    2023-03-07
    JavaScript图片局部放大预览效果 JavaScript图片局部放大 JavaScript图片放大
  • 如何使用matplotlib库实现图形局部数据放大显示
    本篇内容介绍了“如何使用matplotlib库实现图形局部数据放大显示”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、绘制总体图形impo...
    99+
    2023-06-29
  • vue3怎么使用useMouseInElement实现图片局部放大预览效果
    本文小编为大家详细介绍“vue3怎么使用useMouseInElement实现图片局部放大预览效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue3怎么使用useMouseInElement实现图片局部放大预览效果”文章能帮助大家解决...
    99+
    2023-07-05
  • Python使用Plotly绘制常见5种动态交互式图表
    目录启动动画太阳图平行类别平行坐标图量表图和指示器数据可以帮助我们描述这个世界、阐释自己的想法和展示自己的成果,但如果只有单调乏味的文本和数字,我们却往往能难抓住观众的眼球。而很多时...
    99+
    2024-04-02
  • vue3使用useMouseInElement实现图片局部放大预览效果实例代码
    目录1、首先要安装@vueuse/core2、实现过程如下:3、使用:在其他的.vue文件中导入组件即可使用4、效果如下:总结1、首先要安装@vueuse/core npm i @v...
    99+
    2023-03-19
    vue图片预览放大缩小 vue点击图片放大 vue实现文件预览功能
  • JavaScript怎么实现淘宝网图片的局部放大功能
    这篇“JavaScript怎么实现淘宝网图片的局部放大功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript...
    99+
    2023-06-30
  • Python利用matplotlib实现饼图绘制
    目录前言1. 等高线图概述什么是饼图?饼图常用场景绘制等饼图步骤案例展示2. 饼图属性设置饼图的颜色设置标签设置突出部分设置填入百分比数值饼图旋转设置阴影3. 调整饼图的大小4. 添...
    99+
    2024-04-02
  • JavaScript如何实现购物车图片局部放大预览效果
    这篇文章主要介绍了JavaScript如何实现购物车图片局部放大预览效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript如何实现购物车图片局部放大预览效果文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • Python Matplotlib库实现画局部图
    在画图中,我们需要放大图像的某一部分,看清其变化。最近在写论文时,就遇到了这个问题,还有坐标轴加粗、控制线型和大小等要求。这些,都可以通过Python Matplotlib库实现。具...
    99+
    2024-04-02
  • 利用Python实现热力图的绘制
    目录1. 引言2. 读取图像3. 图像灰度化4. 像素化效果5. 为热力图选择调色板1. 引言 热力图,是一种通过对色块着色来显示数据的统计图表。绘图时,需指定颜色映射的规则。例如,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作