matplotlib局部放大图,python的plot画多张图
大家好,本文主要讲python使用plotly绘制局部放大图。有兴趣的同学过来看看。如果对你有帮助,记得收藏。
00-1010最终效果展示实现思路。导入库随机生成一些数据包绘图代码开始绘图汇总。
目录
最终效果展示
在绘图区域插入嵌入图像,嵌入图像与原图像的绘制一致。通过限制嵌入图像的X轴和Y轴的显示范围,达到缩放的效果,并在原图像上画一个矩形框,突出放大的区域。最后,缩放关系用两条直线突出显示。
实现思路
将plotly.io作为pio导入
导入plotly.graph_objects as go
进口熊猫作为pd
将numpy作为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)
对于索引:中的索引
y1[index]=np.random.rand() - 0.5
y1=y1 0.2
y2=np.log(x)
indexs=np.random.randint(0,1000,800)
对于索引:中的索引
y2[index]=np.random.rand() - 0.5
y3=np.log(x)
indexs=np.random.randint(0,1000,800)
对于索引:中的索引
y3[index]=np.random.rand() - 0.5
y3=y3 - 0.2
随机生成一些数据
类LocalZoomPlot:
def __init__(self,x,y,colors,x_range,scale=0。):
:param x: x轴坐标,列表类型
:param y: y轴坐标,二维列表类型,例如[y1,y2,y3]
:参数颜色:每条曲线的颜色必须等于len(y)
:param x_range:需要缩放区域的x轴范围。
:param scale:详见getRangeMinMaxValue函数。
self.x=x
self.y=y
self.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])
#按一定比例缩放
最小值=最小值-(最大值-最小值)*小数位数
最大值=最大值(最大值-最小值)*
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.)
总结
到此这篇关于python用plotly实现绘制局部放大图的文章就介绍到这了,更多相关python plotly绘制局部放大图内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。