当我读到报纸时遗传算法雅各布斯等人./太空研究的进展,68(2021), 746--761中,我发现了这样一张有趣的图:
我们称之为二维极坐标直方图。(也许它有更合适的名字?)
我的问题是:我可以用 PGFPlots 绘制这种二维极坐标直方图吗?
我正在尝试寻找其他绘图方法。我找到了一种使用 Python 进行绘图的方案,它这里。不幸的是,它有一点点 bug。
答案1
以下答案使用轮图包,是我写的。
有一个 for 循环遍历切片。这里,每个切片有 3 个数字,分别表示角度、半径和值。
每个切片由单独的 绘制\wheelchart
。
半径用函数解释\WCdefradius
。值决定颜色。角度决定切片的起始角度。
\documentclass[border=6pt,dvipsnames]{standalone}
\usepackage{listofitems}
\readlist\WCcolors{MidnightBlue,Cyan,Green,Yellow,Orange,Red}
\usepackage{wheelchart}
\begin{document}
\begin{tikzpicture}[scale=0.1]
\def\a{30}
\def\r{10}
\def\WCdefradius#1{\fpeval{trunc(#1/\r,0)*\r}}
\foreach\angle/\radius/\value in {
4/2.9/180,2/11/90,21/25/48,1/31/7,25/53/0,
34/2.9/43,32/11/90,51/25/9,31/31/11,59/49/4,
64/2.9/91,62/11/36,81/25/81,89/49/7,85/53/3,
94/2.9/180,92/11/90,91/31/7,119/49/4,115/53/0,
124/2.9/123,122/11/90,141/25/9,121/31/11,
154/2.9/92,152/11/203,171/25/81,151/31/7,
184/2.9/180,182/11/90,201/25/48,181/31/7,205/53/0,
214/2.9/43,212/11/90,231/25/9,211/31/11,239/49/4,
244/2.9/91,242/11/36,261/25/81,269/49/4,265/53/0,
274/2.9/180,272/11/90,271/31/7,299/49/4,295/53/0,
304/2.9/123,302/11/90,301/25/108,301/31/11,
334/2.9/92,332/11/36,351/25/81,331/31/7
}{
\wheelchart[
counterclockwise,
data=,
radius={\WCdefradius{\radius}}{\WCdefradius{\radius}+\r},
slices style={
/utils/exec={
\pgfmathparse{
\value<1?1:
(\value<5?2:
(\value<10?3:
(\value<50?4:
(\value<100?5:
6
))))
}
},
\WCcolors[\pgfmathresult]
},
start angle={int(\angle/\a)*\a},
total angle=\a,
value=1
]{\angle/\radius/\value}
}
\draw (0,0) circle[radius={6*\r}];
\end{tikzpicture}
\end{document}
答案2
\documentclass[border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\usepgfplotslibrary{polar}
\begin{document}
\begin{tikzpicture}
\begin{polaraxis}[
xmin=0, xmax=360,
ymin=0, ymax=1,
xtick distance=45,
axis on top,
colormap/jet,
]
\addplot3[
surf,
domain=0:360, samples=37,
domain y=0:1, samples y=40,
x filter/.expression={rnd^2*y>0.5?nan:x},
unbounded coords=jump,
] {-y*(sin(3*x)+rnd)};
\end{polaraxis}
\end{tikzpicture}
\end{document}
编辑:使用surf, shader=flat,
和其他测试功能: