Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过移动直线获得坡度?_Python_Excel_Vba_Plot - Fatal编程技术网

Python 如何通过移动直线获得坡度?

Python 如何通过移动直线获得坡度?,python,excel,vba,plot,Python,Excel,Vba,Plot,我想知道是否有任何可能的方法来获得我在图形上手动移动的直线的斜率。所有需要的是斜率(m),我不关心R平方等。下面的图像只是为了说明 注意:应使用光标手动移动该行 这在excel中可能是不可能的,但如果您知道我应该从哪里开始查找,它将非常有用!谢谢 获取直线的实际(文字)坡度相当简单,即使直线没有暴露其端点,我们也可以使用其.Top、.Left、.Height和.Width属性来推导这些坡度,然后应用标准坡度公式: 函数GetSlope(此线为形状) 暗网 如果不是IsLine(这条线),则 re

我想知道是否有任何可能的方法来获得我在图形上手动移动的直线的斜率。所有需要的是斜率(m),我不关心R平方等。下面的图像只是为了说明

注意:应使用光标手动移动该行

这在excel中可能是不可能的,但如果您知道我应该从哪里开始查找,它将非常有用!谢谢

获取直线的实际(文字)坡度相当简单,即使直线没有暴露其端点,我们也可以使用其
.Top
.Left
.Height
.Width
属性来推导这些坡度,然后应用标准坡度公式:

函数GetSlope(此线为形状)
暗网
如果不是IsLine(这条线),则
ret=CVErr(13)
去早退
如果结束
尺寸x1为单个,x2为单个,y1为单个,y2为单个
用这条线
x1=.左
x2=.左+宽度
y1=.Top
y2=顶部+高度
以
ret=(y2-y1)/(x2-x1)
提前退出:
GetSlope=ret
端函数
专用函数IsLine(shp作为形状)作为布尔值
IsLine=shp.Type=msoLine
端函数
然而(这可能是一个交易破坏者,取决于您实际希望在这里获得什么),这不太可能是相对于绘图区域的坡度,这取决于轴的大小和比例。例如,下图绘制了一系列x/y坐标和斜率,给出的斜率为
y=2x
,但是
GetSlope
函数给出的斜率(对于斜率大致相同的线型)返回
0.9166661
,这是该直线相对于其位置坐标的文字斜率

似乎您可能需要进一步的修改来近似(我不确定您可以如何精确地实现这一点)绘图/比例中直线端点的X/Y坐标。我认为这将使你在合理的精度范围内达到或大部分达到目标:

选项显式
副秘书长()
作为图表对象的暗淡cObj
暗海隧As图
像形状一样变暗的线
将shp变暗为形状
设置cObj=Sheet1.图表对象(1)
设置cht=cObj.图表
设置shpLine=cht.形状(1)
MsgBox GetSlopeWithinChart(cht Spline)
端接头
函数GetSlopeWithinChart(此线为形状,cht为图表)
暗网
如果不是IsLine(这条线),则
ret=CVErr(13)
去早退
如果结束
尺寸x1为单个,x2为单个,y1为单个,y2为单个
将绘图变暗为绘图区域
Dim xFactor作为双精度
双因子
设置plot=cht.PlotArea
xFactor=getScaleFactor(plot.Width,cht.Axes(xlCategory,xlPrimary))
yFactor=getScaleFactor(plot.Height,cht.Axes(xlValue,xlPrimary))
用这条线
x1=.左
x2=.左+宽度
y1=.Top
y2=顶部+高度
以
ret=((y2-y1)/(x2-x1))/(yFactor/xFactor)
提前退出:
GetSlopeWithinChart=ret
端函数
私有函数getScaleFactor(大小为单个,ax为轴)
getScaleFactor=大小/(最大最大刻度-最大最小刻度)
端函数
专用函数IsLine(shp作为形状)作为布尔值
IsLine=shp.Type=msoLine
端函数

另一个坡度试验,预计为~10:

注意:这似乎不能解释直线的“方向”,因此它不能正确地为向下倾斜的直线提供负斜率值。我不确定是否有一种简单的方法来推导直线的方向,因此我将留给您:)这里我们看到,一个正斜率值,即使直线看起来是向下的:


尽可能用鼠标移动点,但不容易。请参阅关于如何为嵌入式图表启用事件。一旦启用它们,最棘手的部分就是关联鼠标坐标和轴坐标。这可能是一个头痛得到正确的。最简单的方法可能是创建一个单点数据系列,并确定如何检测何时选中它。在宏中使用该函数时,我将“thisLine”称为“直线连接器2”,将“Chart”称为“Chart 1”。但是,我得到了一个错误:thisLine的类型不匹配。你能告诉我你是怎么把这条线称为形状的吗?
这条线是形状的,而cht是图表的。这些是对象,而不是它们的名称或字符串。例如,
GetSlopeWithinChart(ActiveSheet.ChartObjects(1.Chart.Shapes)(1),ActiveSheet.ChartObjects(1.Chart)
。将实际对象传递给函数。注意:这是使用图表中的一条线而不是工作表中的一条线进行测试的。我已经编辑了答案,以包括我使用的测试程序
foo
。谢谢David,它工作正常。我将努力提高准确性,因为它是在我的电脑约4%关闭。我真的很喜欢你的方法!干杯这是一个有趣的问题需要解决:)你可能需要考虑的另一个问题是轴的厚度,这可能会稍微影响绘图区域的大小。但最终,如果你这样做,以1或2小数,你应该是相当准确的大多数情况下。