2015-06-02 5 views
2

Я пытаюсь построить линии тока на полярной оси в matplotlib 1.4.3. Функция streamplot существует примерно с 1.2.0 и считается документированной функциональной и стабильной. Вот небольшой тестовый скрипт:Matplotlib - Как построить линии тока в полярных координатах?

from matplotlib import pyplot as plt 
import numpy as np 

# Define polar grid 
r = np.arange(0,2001,50) 
theta = np.arange(-np.pi, np.pi+np.pi/180, 2*np.pi/180) 
r2D, theta2D = np.meshgrid(r, theta) 
# Define some data 
u = -np.sin(theta2D) 
v = np.cos(theta2D) 
# Set up axes 
fig = plt.figure() 
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8], polar=True) 
# Plot streamlines 
ax.streamplot(r, theta, u, v, color='k', density=1, linewidth=1) 

Этот скрипт не со следующей TRACEBACK:

Traceback (most recent call last): 
    File "streamline_test.py", line 15, in <module> 
    ax.streamplot(r, theta, u, v, color='k', density=1, linewidth=1) 
    File "python2.7/site-packages/matplotlib/axes/_axes.py", line 4204, in streamplot 
    zorder=zorder) 
    File "python2.7/site-packages/matplotlib/streamplot.py", line 167, in streamplot 
    axes.add_patch(p) 
    File "python2.7/site-packages/matplotlib/axes/_base.py", line 1568, in add_patch 
    self._update_patch_limits(p) 
    File "python2.7/site-packages/matplotlib/axes/_base.py", line 1586, in _update_patch_limits 
    vertices = patch.get_path().vertices 
    File "python2.7/site-packages/matplotlib/patches.py", line 4033, in get_path 
    _path, fillable = self.get_path_in_displaycoord() 
    File "python2.7/site-packages/matplotlib/patches.py", line 4054, in get_path_in_displaycoord 
    shrinkB=self.shrinkB * dpi_cor 
    File "python2.7/site-packages/matplotlib/patches.py", line 2613, in __call__ 
    shrinked_path = self._shrink(clipped_path, shrinkA, shrinkB) 
    File "python2.7/site-packages/matplotlib/patches.py", line 2586, in _shrink 
    left, right = split_path_inout(path, insideA) 
    File "python2.7/site-packages/matplotlib/bezier.py", line 246, in split_path_inout 
    ctl_points, command = next(path_iter) 
StopIteration 

Видимо streamplot итерация навсегда и должен остановиться на какой-то момент. Я также попробовал набор регулярно разнесенных декартовых точек, применяемых к полярной оси, но это не так. Создание полярного графика с использованием декартовых осей не является вариантом, так как мне нужна полярная сетка, но такая сетка не имеет регулярных интервалов в декартовых координатах, а для потока требуется регулярные интервалы.

Кто-нибудь знает, как получить matplotlib для построения линий тока в полярных координатах?

ответ

0

Вам просто нужно переключить радиальные и азимутальные координаты. Следующий код составляет this plot; обратите внимание на деление на r в третьем аргументе до streamplot(), который преобразует линейную и угловую скорость:

import math 
import numpy 
import matplotlib 
from matplotlib import pyplot 

pyplot.gcf().add_axes([0.1, 0.1, 0.8, 0.8], polar=True) 

r = numpy.linspace(0, 1, 11) 
phi = numpy.linspace(-1, 1, 361) * math.pi 
r, phi = numpy.meshgrid(r, phi) 

ones = numpy.ones_like(r) 
zeros = numpy.zeros_like(r) 
pyplot.streamplot(
    phi.transpose(), r.transpose(), 
    (ones/r).transpose(), zeros.transpose(), 
    color='red') 
pyplot.streamplot(
    phi.transpose(), r.transpose(), 
    (zeros/r).transpose(), ones.transpose(), 
    color='blue') 
pyplot.ylim(0, 1) 
pyplot.annotate(matplotlib.__version__, 
    (0, 0), (1, 0), 'axes fraction', 'axes fraction', 
    ha='left', va='top') 
pyplot.savefig('stream.png') 
Смежные вопросы