python怎么用plotly实现绘制局部放大图
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章将为大家详细讲解有关python怎么用plotly实现绘制局部放大图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最终效果展示实现思路在绘图区域插入一个嵌入
千家信息网最后更新 2025年02月23日python怎么用plotly实现绘制局部放大图
这篇文章将为大家详细讲解有关python怎么用plotly实现绘制局部放大图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
最终效果展示
实现思路
在绘图区域插入一个嵌入图,嵌入图与原图的绘画保持一致,通过限制嵌入图的x轴和y轴的显示范围,达到缩放的效果,并在原图上绘画一个矩形框,以凸显缩放的区域,最后通过两条直线凸显缩放关系。
导入库
import plotly.io as pioimport plotly.graph_objects as goimport pandas as pdimport 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.5y1 = y1 + 0.2y2 = np.log(x)indexs = np.random.randint(0, 1000, 800)for index in indexs: y2[index] += np.random.rand() - 0.5y3 = np.log(x)indexs = np.random.randint(0, 1000, 800)for index in indexs: y3[index] += np.random.rand() - 0.5y3 = 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实现绘制局部放大图"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
坐标
区域
范围
实例
数据
绘画
局部
位置
篇文章
原始
最大
最小
一致
主题
原图
参数
左上角
效果
更多
最大值
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
idea连接oracle数据库
网络安全应急响应机制建设
专业服务器安全加固系统厂家
防范通信网络安全
安徽app软件开发服务
信用社的软件开发岗怎么样
深圳专业软件开发代理价格
mysql修改数据库引擎
rust 星魂 服务器
山东手机软件开发大概多少钱
数据库优化从哪些方面进行
巩义迎泰网络技术服务
网络安全移动支付
opc服务器软件怎么用
手机怎么远程云服务器
龙华软件开发招应届毕业生
数据库删除借阅表命令
湖南企业软件开发直销价格
软件开发工作具体工作内容
杭州云旭网络技术有限公司
知名专业软件开发公司
明日之后南希市这个服务器哪去了
宣传网络安全法作文
学习网络技术知识
商会如何做好网络安全
评论 数据库设计
下载服务器登录失败
黄山手机软件开发需要多少钱
云托管模型 网络安全监督
四川视听通网络技术