3D полярный сюжет на матплотлибе - PullRequest
0 голосов
/ 31 октября 2018

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

Я использую следующий код Python для построения трехмерного графика.

import numpy as np
import matplotlib.pyplot as plt
from os.path import exists
from os import sys
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D

N=int(sys.argv[1]);
filling=int(sys.argv[2]);
trial=int(sys.argv[3]);

filename = 'density_N%d_filling%d_trial%d'  % (N,filling,trial);
filename2 = 'init_%d_%d_%d'                     % (N,filling,trial);

if exists(filename2):
   a=np.loadtxt(filename2)
   NUMBINS=int(np.round(a[0]));
   dR2=a[1]
   dtheta=a[2]
   rmax = a[3];


def read_file(filename):
    with open(filename,'r') as data:
       x = []
       y = []
       for line in data:
          p = line.split()
          for i in range(NUMBINS):
              x.append(float(p[i]))
          y.append(np.array(x))
          x=[]
    return y

density = np.array(read_file(filename))

density = density*NUMBINS/(np.pi*dR2)
localfillingfraction=2*np.pi*density;
r = np.sqrt(np.arange(0,rmax*rmax,dR2) )[:NUMBINS]
theta = np.array([dtheta for point in r])
mpl.rcParams['legend.fontsize'] = 10

sdensity = np.transpose(localfillingfraction)
fig = plt.figure()
ax = fig.gca(projection='3d')

for n, armonic in enumerate(sdensity):
   ax.plot(r,theta*n,armonic)       
plt.savefig("N%d_FILLING%d_trial%d.pdf" % (N,filling,trial));
plt.title('filling fraction, v = 1/' + str(filling))
plt.xlabel('Radius (units of lB)')
plt.ylabel('angle(Rad)')
plt.show()

Итак, filename2 содержит четыре параметра, которые мне нужны для расчета. имя файла - это двумерная матрица с полярными данными. read_file () - это функция, которую я сделал, чтобы прочитать эту 2D матрицу в список. Хотя матрица содержит радиальные данные в виде столбцов, код отображал их в обратном порядке. Вот почему я должен был транспонировать матрицу. В конце я получаю следующий график: Заполняющая фракция как функция R, тета

Несмотря на то, что этот график работает, но радиус и угол по-прежнему отображаются в виде декартовых координат. Можно ли заставить его выглядеть полярным?

1 Ответ

0 голосов
/ 18 марта 2019

Итак, я попробовал этот вариант кода, который использует полярный график типа тепловой карты, который действительно прост и понятен, чтобы показать угловое + радиальное распределение.

#! /usr/bin/env python
import numpy as np
import matplotlib.pyplot as plt
from os.path import exists
from os import sys
import matplotlib as mpl
from matplotlib import rc
from mpl_toolkits.mplot3d import Axes3D
#=========================================

N=int(sys.argv[1]);
filling=int(sys.argv[2]);
trial=int(sys.argv[3]);

#=====================================================================

filename = 'density_N%d_filling%d_trial%d'  % (N,filling,trial);
filename2 = 'init_%d_%d_%d'                     % (N,filling,trial);

if exists(filename2):
    a=np.loadtxt(filename2)
    NUMBINS=int(np.round(a[0]));
    print(NUMBINS)
    dR2=a[1]
    dtheta=a[2]
    rmax = a[3];

#===========================================================================
'''This part reads the 2D array of NUMBIN*NUMBIN, row by row.
   Thus, the returned list y consists of a linear array of dimension
   [NUMBIN,0] with each element is itself a list containing each row.'''

def read_file(filename):
    with open(filename,'r') as data:
        x = []
        y = []
        for line in data:
            p = line.split()
            for i in range(NUMBINS):
                x.append(float(p[i]))
            y.append(np.array(x))
            x=[]
    return y

density = np.array(read_file(filename))
#==========================================================================

density = density*NUMBINS/(np.pi*dR2)
localfillingfraction=2*np.pi*density;
r = np.sqrt(np.arange(0,rmax*rmax,dR2) )[:NUMBINS]
theta = np.linspace(0,2*np.pi,NUMBINS)

mpl.rcParams['legend.fontsize'] = 10

#===============================================================
'''the matrix needed to be trasposed, to get the radial and angular
   data to be read correctly'''

sdensity = np.transpose(localfillingfraction)

fig = plt.figure()
ax = Axes3D(fig)
rad, th = np.meshgrid(r,theta)
plt.subplot(projection="polar")
plt.pcolormesh(th,rad,sdensity)
plt.thetagrids([theta * 15 for theta in range(360//15)])
plt.plot(theta,rad,color='k',ls='none')
plt.grid()
plt.savefig("N%d_FILLING%d_trial%d.jpg" % (N,filling,trial));
plt.show()

Сюжет выглядит следующим образом:

enter image description here

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