欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python用plotly實(shí)現(xiàn)繪制局部放大圖

 更新時(shí)間:2022年02月13日 11:17:56   作者:Eloik  
大家好,本篇文章主要講的是python用plotly實(shí)現(xiàn)繪制局部放大圖,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下

最終效果展示

在這里插入圖片描述

實(shí)現(xiàn)思路

在繪圖區(qū)域插入一個(gè)嵌入圖,嵌入圖與原圖的繪畫保持一致,通過限制嵌入圖的x軸和y軸的顯示范圍,達(dá)到縮放的效果,并在原圖上繪畫一個(gè)矩形框,以凸顯縮放的區(qū)域,最后通過兩條直線凸顯縮放關(guān)系。

導(dǎo)入庫

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

# 設(shè)置plotly默認(rèn)主題,白色主題
pio.templates.default = 'plotly_white'

隨機(jī)生成一些數(shù)據(jù)

# x坐標(biāo)
x = np.arange(1, 1001)

# 生成y軸數(shù)據(jù),并添加隨機(jī)波動(dòng)
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軸坐標(biāo),列表類型
        :param y: y軸坐標(biāo),二維列表類型,例如 [y1, y2, y3]
        :param colors: 每個(gè)曲線的顏色,必須與 len(y) 相等
        :param x_range: 需要縮放區(qū)域的x軸范圍
        :param scale: 詳見 getRangeMinMaxValue 函數(shù)
        """
        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軸范圍內(nèi),所有y數(shù)據(jù)的最大值和最小值

        :param x_range: 期望局部放大的x軸范圍
        :param scale: 將最大值和最小值向兩側(cè)延伸一定距離
        """
        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
        # 返回縮放后的結(jié)果
        return min_value, max_value
    
    def originPlot(self, fig, **kwargs):
        """
        根據(jù) y 數(shù)據(jù)繪制初始折線圖

        :param fig: go.Figure實(shí)例
        """
        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對(duì)象實(shí)例
        :param inset_axes: 嵌入圖的位置和大小 [左下角的x軸位置, 左下角的y軸位置, 寬度, 高度]
          所有坐標(biāo)都是絕對(duì)坐標(biāo)(0~1之間)
        """
        # 使用創(chuàng)建子圖中的嵌入圖參數(shù),創(chuàng)建一個(gè)嵌入圖
        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 參數(shù)確保是在嵌入圖上繪畫的
        fig = self.originPlot(fig, xaxis='x2', yaxis='y2', showlegend=False)
        # 將嵌入圖的坐標(biāo)軸范圍限定在指定范圍
        fig.update_layout(
            xaxis2=dict(range=self.x_range),
            yaxis2=dict(range=self.y_range)
        )
        return fig
    
    def rectOriginArea(self, fig):
        """
        將放大的區(qū)域框起來

        :param fig: go.Figure實(shí)例
        """
        fig.add_trace(go.Scatter(
        	# 從左上角開始,順時(shí)針連線
            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):
        """
        從放大區(qū)域指定點(diǎn)連線

        :param fig: go.Figure實(shí)例
        :param area_point_num: 放大區(qū)域的錨點(diǎn),例如:(0, 0)表示放大區(qū)域的左下角坐標(biāo),(0, 1)表示左上角坐標(biāo),
          (1, 0)表示右下角坐標(biāo),(1, 1)表示右上角坐標(biāo),只能取這四種情況
        :param point: 要進(jìn)行連線的另一個(gè)點(diǎn),通常位于嵌入圖附近,根據(jù)美觀程度自行指定
        """
        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))

# 額外對(duì)圖片進(jìn)行設(shè)置
fig.update_layout(
    width=800, height=600,
    xaxis=dict(
        rangemode='tozero',
        showgrid=False,
        zeroline=False,
    ),
    xaxis2=dict(
        showgrid=False,
        zeroline=False
    ),
)

fig.show()

總結(jié)

到此這篇關(guān)于python用plotly實(shí)現(xiàn)繪制局部放大圖的文章就介紹到這了,更多相關(guān)python plotly繪制局部放大圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何使用pycharm連接Databricks的步驟詳解

    如何使用pycharm連接Databricks的步驟詳解

    這篇文章主要介紹了如何使用pycharm連接Databricks,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • python如何拆分含有多種分隔符的字符串

    python如何拆分含有多種分隔符的字符串

    這篇文章主要為大家詳細(xì)介紹了python如何拆分含有多種分隔符的字符串,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Python 調(diào)用 ES、Solr、Phoenix的示例代碼

    Python 調(diào)用 ES、Solr、Phoenix的示例代碼

    這篇文章主要介紹了Python 調(diào)用 ES、Solr、Phoenix的示例代碼,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-11-11
  • python輸入多行的方法總結(jié)

    python輸入多行的方法總結(jié)

    Python中的Input()函數(shù)在輸入時(shí),遇到回車符,那么一次輸入就結(jié)束了,這不能滿足輸入多行文本并且行數(shù)也不確定的情形,當(dāng)然輸入空行也是允許的,本文給大家總結(jié)了python輸入多行的方法,需要的朋友可以參考下
    2024-04-04
  • python如何讀取bin文件并下發(fā)串口

    python如何讀取bin文件并下發(fā)串口

    這篇文章主要介紹了python如何讀取bin文件并下發(fā)串口,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python字符串hashlib加密模塊使用案例

    Python字符串hashlib加密模塊使用案例

    這篇文章主要介紹了Python字符串hashlib加密模塊使用案例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • python 編碼中為什么要寫類型注解?

    python 編碼中為什么要寫類型注解?

    這篇文章主要介紹了python 編碼中為什么要寫類型注解,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • python正則分組的應(yīng)用

    python正則分組的應(yīng)用

    組是通過 "(" 和 ")" 元字符來標(biāo)識(shí)的。 "(" 和 ")" 有很多在數(shù)學(xué)表達(dá)式中相同的意思;它們一起把在它們里面的表達(dá)式組成一組
    2013-11-11
  • 使用Python實(shí)現(xiàn)合并多個(gè)Excel文件

    使用Python實(shí)現(xiàn)合并多個(gè)Excel文件

    合并Excel可以將多個(gè)文件中的數(shù)據(jù)合并到一個(gè)文件中,這樣可以幫助我們更好地匯總和管理數(shù)據(jù),本文主要介紹了如何使用第三方Python庫 Spire.XLS for Python 實(shí)現(xiàn)以上兩種合并Excel文件的需求,有需要的可以了解下
    2023-12-12
  • python安裝oracle擴(kuò)展及數(shù)據(jù)庫連接方法

    python安裝oracle擴(kuò)展及數(shù)據(jù)庫連接方法

    這篇文章主要介紹了python安裝oracle擴(kuò)展及數(shù)據(jù)庫連接方法,較為詳細(xì)的分析了Python下載oracle擴(kuò)展及Windows、Linux環(huán)境下的安裝步驟、操作技巧及注意事項(xiàng),需要的朋友可以參考下
    2017-02-02

最新評(píng)論