Ошибка при построении размера маркера, пропорционального функции x, y, z в диаграмме рассеяния matplotlib - PullRequest
0 голосов
/ 03 мая 2020

Моя идея состоит в том, чтобы построить трехмерный график дивергенции векторного поля, где маркер в каждой точке будет пропорционален дивергенции в этой точке. Векторное поле, которое я использую: (x ^ 2 + y ^ 2) i + (y ^ 2 + z ^ 2) j = (Z ^ 2 + x ^ 2) k Однако я нахожу трудности в настройке размера маркера согласно значению дивергенции.

def div(a1,b1,c1):
    a,b,c= sp.symbols('a b c')
    p = a**2 + b**2
    q = b**2 + c**2
    r = c**2 + a**2
    div = sp.diff(p,a) + sp.diff(q,b) + sp.diff(r,c)
    res_div = div.subs([(a,a1),(b,b1),(c,c1)])
    return(abs(res_div))
a, b, c = np.meshgrid(np.arange(-2, 2, 0.8),
                      np.arange(-2, 2, 0.8),
                      np.arange(-2, 2, 0.8))
a = a.reshape(np.product(x.shape))
b = b.reshape(np.product(y.shape))
c = c.reshape(np.product(z.shape))
k = div(a,b,c)
ax.scatter(a,b,c , s= k ,c= "green")
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-15-b669c8d62416> in <module>
     72 c = c.reshape(np.product(z.shape))
     73 k = div(a,b,c)
---> 74 ax.scatter(a,b,c , s= k ,c= "green")

C:\AnaConda\lib\site-packages\mpl_toolkits\mplot3d\axes3d.py in scatter(self, xs, ys, zs, zdir, s, c, depthshade, *args, **kwargs)
   2357         xs, ys, zs, s, c = cbook.delete_masked_points(xs, ys, zs, s, c)
   2358 
-> 2359         patches = super().scatter(xs, ys, s=s, c=c, *args, **kwargs)
   2360         art3d.patch_collection_2d_to_3d(patches, zs=zs, zdir=zdir,
   2361                                         depthshade=depthshade)

C:\AnaConda\lib\site-packages\matplotlib\__init__.py in inner(ax, data, *args, **kwargs)
   1599     def inner(ax, *args, data=None, **kwargs):
   1600         if data is None:
-> 1601             return func(ax, *map(sanitize_sequence, args), **kwargs)
   1602 
   1603         bound = new_sig.bind(ax, *args, **kwargs)

C:\AnaConda\lib\site-packages\matplotlib\axes\_axes.py in scatter(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, plotnonfinite, **kwargs)
   4496                 offsets=offsets,
   4497                 transOffset=kwargs.pop('transform', self.transData),
-> 4498                 alpha=alpha
   4499                 )
   4500         collection.set_transform(mtransforms.IdentityTransform())

C:\AnaConda\lib\site-packages\matplotlib\collections.py in __init__(self, paths, sizes, **kwargs)
    883         Collection.__init__(self, **kwargs)
    884         self.set_paths(paths)
--> 885         self.set_sizes(sizes)
    886         self.stale = True
    887 

C:\AnaConda\lib\site-packages\matplotlib\collections.py in set_sizes(self, sizes, dpi)
    855             self._sizes = np.asarray(sizes)
    856             self._transforms = np.zeros((len(self._sizes), 3, 3))
--> 857             scale = np.sqrt(self._sizes) * dpi / 72.0 * self._factor
    858             self._transforms[:, 0, 0] = scale
    859             self._transforms[:, 1, 1] = scale

AttributeError: 'Abs' object has no attribute 'sqrt'

В идеале я хочу, чтобы не только размер, но и цвет маркера был красным или зеленым, в зависимости от дивергенции, являющейся отрицательной, положительной.

1 Ответ

0 голосов
/ 04 мая 2020

Наконец-то удалось получить желаемый результат:

с использованием приведенного ниже кодового блока:

a,b,c = sp.symbols('a b c')
Pa = a**2 + b**2
Qb = b**2 + c**2
Rc = c**2 + a**2

divSp = sp.diff(Pa , a) + sp.diff(Qb , b) + sp.diff(Rc , c)
divnp = lambdify((a,b,c) , divSp ,"numpy")

col = np.where(divnp(x,y,z) > 0 , 'green' , 'red')
#colors=['red' if divnp(x,y,z) <=0 else 'green' if divnp(x,y,z) > 0]
for x1,y1,z1,d1,m in zip(x,y,z,abs(divnp(x,y,z)), col):
    ax.scatter(x1, y1, z1,s = d1*70, c = m)

Размер маркера в каждой точке пропорционален расхождению в этой точке, красный цвет указывает на -ve & зеленое + ve расхождение Черные стрелки показывают векторное поле, а красные стрелки - направление и величину скручивания.

График расхождения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...