+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

尝试将标准极星更改为更优雅的椭圆形

发布于2020-09-18 13:36     阅读(1097)     评论(0)     点赞(29)     收藏(1)


0

1

2

3

4

5

6

7

我正在尝试在极坐标图中可视化测量环空中的压力。问题是我只有6个测量点,因此该图为星形,而由于液体中的垂直压力梯度,该图应为椭圆形。请注意,由于左右注射压力可以不同,因此不必一定是圆形。

首先,我尝试使用matplotlib的Polar函数绘制图,从而生成星形图。然后,我尝试分散数据,但现在无法通过数据点拟合椭圆。

loc_deg =(71, 11, 306, 234, 169, 109, 71) #  location of sensors 1, 2, 3, 4, 5, 6, 1 1 is repeated to complete the star/circle
loc_rad = np.radians(loc_deg) # use radians

P = (2.7269999999999999, 3.0019999999999998, 0.39800000000000002, 2.9729999999999999, 2.5099999999999998, 2.5609999999999999, 2.7269999999999999)

fig = plt.figure() 
ax = fig.add_subplot(111,projection = 'polar')

ax.set_ylim(0,10)
ax.set_xticks(loc_rad)

tv = ax.plot(loc_rad, P)# create star
lis = ax.scatter(loc_rad, P, color = '#ff7f00', marker = '.') # create scatter

现在,我正在尝试通过散点图拟合椭圆,否则星号应在椭圆中改变。

编辑 这是三种解决方案的图解,其中包括Ardweaden提出的一种

尝试使用Ardweadens解决方案后,我意识到合适的衣服并非我要找的东西,因此我的问题尚不清楚。我正在寻找一种方法来连接极性表面上的点,而不仅仅是直线。

例如:如果有两个测量点:1度1点和179度1点,并且这两个测量均为值10。通过使用绘图函数,直线在插值时在90度时将显示几乎为0的值。在10到10之间,您也会期望那里的值为10。所以更像一个半圈。


解决方案


只适合椭圆。

from scipy.optimize import curve_fit

def ellipse(phi,b,e,f):
    return b/(np.sqrt(1 - e * np.cos(phi + f)**2))

popt, pcov = curve_fit(ellipse, loc_rad, P)
x = np.arange(0,2*np.pi,0.01)

ax = fig.add_subplot(111,projection = 'polar')
ax.plot(x,ellipse(x,popt[0],popt[1],popt[2]))

硬编码数据并绘制渐变:

loc_deg =(306, 234, 169, 109,71,11) #  location of sensors 1, 2, 3, 4, 5, 6, 1 1 is repeated to complete the star/circle
loc_rad = np.radians(loc_deg) # use radians

P = (0.39800000000000002, 2.9729999999999999, 2.5099999999999998, 2.5609999999999999,3.0019999999999998,2.7269999999999999)

fig = plt.figure() 
ax = fig.add_subplot(111,projection = 'polar')

ax.set_ylim(0,10)
ax.set_xticks(loc_rad)

def generate_fit(deg,P,deg_f=1):
    x,y = [],[]

    for i in range(1,len(P)):
        x.extend(np.arange(deg[i-1],deg[i],-1))
        incy = abs(deg[i]-deg[i-1])
        y.extend(np.linspace(P[i-1],P[i],incy))

    x.extend(np.arange(11,0,-1))
    x.extend(np.arange(360,306,-1))
    y.extend(np.linspace(P[-1],P[0],360-306 + 11))
    return np.radians(x),y

x,y = generate_fit(loc_deg,P)
ax.plot(x,y)

ax.scatter(loc_rad, P, color = '#ff7f00', marker = '.')

0

1

2

3

4

5

6



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/530644/7ed5140d4e7d2ff72b7c/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

29 0
收藏该文
已收藏

评论内容:(最多支持255个字符)