用两个数据集的面积绘制图形并得到概率

问题描述 投票:0回答:1

我正在尝试绘制旋转杆端在空间中向前移动时的路径。我制作了一个向量,以一定的旋转速度绕中心旋转,然后以一定的平移速度将向量移动到下一个位置。我使整个函数使用时间步长(for 循环作为时间步长),因此如果需要,我可以使其更准确。所以结果是这样的:

def rotate_vector(vector, angle):
    x = vector[0] * math.cos(angle) - vector[1] * math.sin(angle)
    y = vector[0] * math.sin(angle) + vector[1] * math.cos(angle)
    return [x, y]


fig = go.Figure()
rod_1 = np.array([0, -(1.0/2)])
rod_2 = np.array([0, (1.0/2)])
center = np.array([-0.5,0.0])
fig.update_layout(yaxis_range=[-5, 5])
fig.update_layout(xaxis_range=[-2,12])
fig.update_layout(width=1000, height=500)
fig.update_layout(showlegend=False)
#plt.autoscale(False)
speed = 13 #m/s
rot_speed = (math.pi*2*1.5)/(11.50 -10.69) #deg/s
step_size = 0.01
rod_end_1 = {"x": [], "y": []}
rod_end_2 = {"x": [], "y": []}
for i in np.arange(0, 1, step_size): #s
fig.add_trace(go.Scatter(x = [center[0] ,rod_1[0] + center[0]], y = [center[1], rod_1[1]]))
fig.add_trace(go.Scatter(x = [center[0] ,rod_2[0] + center[0]], y = [center[1], rod_2[1]]))
rod_end_1["x"].append(rod_1[0] + center[0])
rod_end_1["y"].append(rod_1[1] + center[1])
rod_end_2["x"].append(rod_2[0] + center[0])
rod_end_2["y"].append(rod_2[1] + center[1])
rod_1 = rotate_vector(rod_1, rot_speed * step_size)
rod_2 = rotate_vector(rod_2, rot_speed * step_size)
center[0] += step_size * speed
fig.show()

这样我就得到了杆端的路径。 我想做的就是填满整条路径,但我无法像我想要的那样得到它: 我想用填充“填充”看起来像第一张图片,但它看起来不像。这是使用plotly的代码:

fig2 = go.Figure()
fig2.update_layout(yaxis_range=[-1, 1])
fig2.update_layout(xaxis_range=[-1,15])
fig2.update_layout(width=1000, height=500)
fig2.add_trace(go.Scatter(x = rod_end_1["x"], y = rod_end_1["y"], fill='tonexty'))
fig2.add_trace(go.Scatter(x = rod_end_2["x"], y = rod_end_2["y"], fill='tonexty'))
fig2.show()

有什么好主意如何让它看起来像第一个填充的吗?

最后我想从杆移动的角度得到隐藏区域的“概率”或百分比。因此,在中心,该值将为 100%,而在正 y 轴上,该值会比负 y 轴上的值略低。就像高斯图一样。

如果有人对如何实现这一点有好主意,或者对我当前编写的代码有任何改进,我将不胜感激。谢谢!

python plot plotly fill
1个回答
0
投票

您已经完成了大部分艰苦的工作:唯一的问题是您绘制的坐标没有顺序。您需要按顺序(随时间推移)绘制杆 1 一端的坐标,然后绘制杆 1 另一端的坐标,然后填充这两条迹线之间的区域。然后对杆 2 执行相同的操作。以下是如何重新组织代码以实现此目的:

import math
import numpy as np
import plotly.graph_objects as go

def rotate_vector(vector, angle):
    x = vector[0] * math.cos(angle) - vector[1] * math.sin(angle)
    y = vector[0] * math.sin(angle) + vector[1] * math.cos(angle)
    return [x, y]

fig = go.Figure()
rod_1 = np.array([0, -(1.0/2)])
rod_2 = np.array([0, (1.0/2)])
center = np.array([-0.5,0.0])
fig.update_layout(yaxis_range=[-1, 1])
fig.update_layout(xaxis_range=[-2,13])
fig.update_layout(width=1000, height=500)
fig.update_layout(showlegend=False)
#plt.autoscale(False)
speed = 13 #m/s
rot_speed = (math.pi*2*1.5)/(11.50 -10.69) #deg/s
step_size = 0.01
rod_end_1 = {"x": [], "y": []}
rod_end_2 = {"x": [], "y": []}
centers = {"x": [], "y": []}
for i in np.arange(0, 1, step_size): #s
    rod_end_1["x"].append(rod_1[0] + center[0])
    rod_end_1["y"].append(rod_1[1] + center[1])
    rod_end_2["x"].append(rod_2[0] + center[0])
    rod_end_2["y"].append(rod_2[1] + center[1])
    rod_1 = rotate_vector(rod_1, rot_speed * step_size)
    rod_2 = rotate_vector(rod_2, rot_speed * step_size)
    center[0] += step_size * speed
    centers["x"].append(center[0])
    centers["y"].append(center[1]) # this coordinate doesn't change, but in case it does later, you'll want to store it

## traces for rod_1
fig.add_trace(go.Scatter(
    x=rod_end_1['x'],
    y=rod_end_1['y'],
    marker=dict(color='#EF553B'),
))
fig.add_trace(go.Scatter(
    x=centers['x'],
    y=centers['y'],
    marker=dict(color='#EF553B'),
    fill='tonexty',
))

## traces for rod_2
fig.add_trace(go.Scatter(
    x=rod_end_2['x'],
    y=rod_end_2['y'],
    marker=dict(color='#636EFA'),
    legendgroup='rod_2',
))
fig.add_trace(go.Scatter(
    x=centers['x'],
    y=centers['y'],
    marker=dict(color='#636EFA'),
    fill='tonexty',
    legendgroup='rod_2',
))
fig.show()

© www.soinside.com 2019 - 2024. All rights reserved.