Python 画极坐标图
需要用Python画极坐标等值线图,以下是所学的一些东西,特此记录
--------------------------------------------------
你应该能够像往常一样使用极地图的ax.contour或ax.contourf 。单位是弧度,传递函数的顺序是,theta,r
import numpy as np
import matplotlib.pyplot as plt #-- Generate Data -----------------------------------------
# Using linspace so that the endpoint of 360 is included...
azimuths = np.radians(np.linspace(0, 360, 20))
zeniths = np.arange(0, 70, 10) r, theta = np.meshgrid(zeniths, azimuths)
values = np.random.random((azimuths.size, zeniths.size)) #-- Plot... ------------------------------------------------
fig, ax = plt.subplots(subplot_kw=dict(projection='polar'))
ax.contourf(theta, r, values) plt.show()
结果
翻译自http://blog.rtwilson.com/producing-polar-contour-plots-with-matplotlib/
创建一些极坐标轴,在上面绘制轮廓图:
fig, ax
=
subplots(subplot_kw
=
dict
(projection
=
'polar'
))
cax
=
ax.contourf(theta, r, values, nlevels)
这个利用了contourf函数,产生了一个填充的轮廓图,使用轮廓函数可以得到简单的轮廓线。这个函数的前三个参数必须被被给定,它们都是二维数组,包含:半径raddi,角度(theta)和轮廓的实际值。最后一个参数是要绘制的轮廓的层次数——如果希望得到等值线图,则数字可以小一些,如果希望得到填充的等值线图,则数字需要大一些(以获得平滑的外观)。(如果希望最外面的轮廓足够圆,则需要网格点足够密集)
我从来没有完全理解这些二维数组,以及为什么需要它们。我通常以三个列表的形式获得我的数据,这些列表基本上是表的列,其中表的每一行都定义了一个点和值。例如:
Radius Theta Value
10 0 0.7
10 90 0.45
10 180 0.9
10 270 0.23
20 0 0.5
20 90 0.13
20 180 0.52
20 270 0.98
这些行中的每一行都定义一个点 - 例如,第一行定义半径为10的点,角度为0度,值为0.7。我永远无法理解为什么轮廓功能不只是采用这三个列表并绘制一个等高线图。事实上,我已经编写了一个函数来完成这个,我将在下面描述,但首先让我解释一下这些值是如何转换为二维数组的。
首先,让我们想一想维数:我们的数据中显然有维数,半径和角度。事实上,我们可以重新塑造我们的数值数组,使得它变成二维的。我们可以从上表中看到,我们正在做半径为10度的所有方位角,然后是半径为20度的相同方位角,等等。因此,我们的值不是存储在一维列表中,我们可以把它们放在一个二维表中,其中列是方位角,行是半径:
0 90 180 270
10 0.7 0.45 0.9 0.23
20 0.5 0.13 0.52 0.98
这正是我们需要为contourf函数赋予的那种二维数组。这并不难理解——但为什么地球上的半径和角度数组也必须是二维的。好吧,基本上我们只需要两个像上面那样的数组,但是在对应的单元格中有相应的半径和角度,而不是值。所以,对于角度,我们有:
0 90 180 270
10 0 90 180 270
20 0 90 180 270
对于半径,我们有:
0 90 180 270
10 10 10 10 10
20 0 20 20 20
然后,当我们将所有三个数组放在一起时,每个单元格将定义我们需要的三个信息。因此,左上角的单元格给出的角度为0,半径为10,值为0.7。幸运的是,你不必手动制作这些数组——一个名为meshgrid的方便的NumPy函数会为你做:
>>> radii = np.arange(0, 60, 10)
>>> print(radii)
[ 0 10 20 30 40 50]
>>> angles = np.arange(0, 360, 90)
>>> print(angles)
[ 0 90 180 270]
>>> np.meshgrid(angles, radii)
[array([[ 0, 90, 180, 270],
[ 0, 90, 180, 270],
[ 0, 90, 180, 270],
[ 0, 90, 180, 270],
[ 0, 90, 180, 270],
[ 0, 90, 180, 270]]), array([[ 0, 0, 0, 0],
[10, 10, 10, 10],
[20, 20, 20, 20],
[30, 30, 30, 30],
[40, 40, 40, 40],
[50, 50, 50, 50]])]
要记住的一点是绘图函数需要以弧度而不是度数作为的角度(θ)的单位,因此如果您的数据是以度为单位(通常是),那么您需要使用NumPy radians函数将其转换为弧度。
完成所有这些操作后,您可以正确地将数据导入轮廓绘图功能,并且可以获得一些极轴,以便绘制它。但是,如果你这样做,你会发现你的轴看起来像这样:
您可以看到零度不在顶部,它位于“东”或“3点”位置,并且角度绕错了方向!显然,这些事情通常都是在数学中完成的——但在我的领域,特别是人们希望有一个顶部为零像指南针一样的极坐标情景!
如果您尝试找到如何执行此操作,您将找到一个StackOverflow答案,其中包含PolarAxes的精彩子类,可以解决这个问题。很赞的是,matplotlib允许你进行这种私人定制,但是如果你看下面接受的答案,你会找到一个名为set_theta_zero_location的函数的matplotlib文档的链接。这个功能非常好地采用指南针方向(“N”或“E”或“NE”等)为零!类似地,函数set_theta_direction设置角度增加的方向。您需要做的就是从轴对象中调用它们:
ax.set_theta_zero_location(
"N"
)
ax.set_theta_direction(
-
1
)
所以,现在我们已经涵盖了我逐渐学到的所有这些,我们可以把它们放在一个函数中。每当我想要绘制一个极坐标等高线图时,我都会使用下面的函数,它对我来说很好。
我不能保证代码对你有用,但希望这篇文章有用,你现在可以离开并在matplotlib中创建极坐标等高线图。
1 import numpy as np
2 from matplotlib.pyplot import *
3
4 def plot_polar_contour(values, azimuths, zeniths):
5 """Plot a polar contour plot, with 0 degrees at the North.
6
7 Arguments:
8
9 * `values` -- A list (or other iterable - eg. a NumPy array) of the values to plot on the
10 contour plot (the `z` values)
11 * `azimuths` -- A list of azimuths (in degrees)
12 * `zeniths` -- A list of zeniths (that is, radii)
13
14 The shapes of these lists are important, and are designed for a particular
15 use case (but should be more generally useful). The values list should be `len(azimuths) * len(zeniths)`
16 long with data for the first azimuth for all the zeniths, then the second azimuth for all the zeniths etc.
17
18 This is designed to work nicely with data that is produced using a loop as follows:
19
20 values = []
21 for azimuth in azimuths:
22 for zenith in zeniths:
23 # Do something and get a result
24 values.append(result)
25
26 After that code the azimuths, zeniths and values lists will be ready to be passed into this function.
27
28 """
29 theta = np.radians(azimuths)
30 zeniths = np.array(zeniths)
31
32 values = np.array(values)
33 values = values.reshape(len(azimuths), len(zeniths))
34
35 r, theta = np.meshgrid(zeniths, np.radians(azimuths))
36 fig, ax = subplots(subplot_kw=dict(projection='polar'))
37 ax.set_theta_zero_location("N")
38 ax.set_theta_direction(-1)
39 autumn()
40 cax = ax.contourf(theta, r, values, 30)
41 autumn()
42 cb = fig.colorbar(cax)
43 cb.set_label("Pixel reflectance")
44
45 return fig, ax, cax
https://www.pythonprogramming.in/plot-polar-graph-in-matplotlib.html
Python 画极坐标图的更多相关文章
- 沉淀再出发:用python画各种图表
沉淀再出发:用python画各种图表 一.前言 最近需要用python来做一些统计和画图,因此做一些笔记. 二.python画各种图表 2.1.使用turtle来画图 import turtle as ...
- python画樱花
用python画简单的樱花 代码如下: import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, t): ...
- python 画小猪佩奇
转自:python画个小猪佩奇 # -*- coding: utf-8 -*- """ Created on Mon May 20 11:36:03 2019 @auth ...
- 用python画 pareto front
用python画 pareto front 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2D pf import os import matplotlib.pyplot as plt im ...
- python 画3D的高斯曲线
用python画3D的高斯曲线,我想如果有多个峰怎么画? import numpy as npimport matplotlib.pyplot as pltimport mathimport mpl_ ...
- python画一只佩奇
用python画一只佩奇 from turtle import* def nose(x,y):#鼻子 penup()#提起笔 goto(x,y)#定位 pendown()#落笔,开始画 sethead ...
- 利用python画出动态高优先权优先调度
之前写过一个文章. 利用python画出SJF调度图 动态高度优先权优先调度 动态优先权调度算法,以就绪队列中各个进程的优先权作为进程调度的依据.各个进程的优先权在创建进程时所赋予,随着进程的推进或其 ...
- 【python画圆】pip安装库时出现Read timed out.解决办法
昨天第一次用python画圆,当时并没有安装numpy库(导入数据包)和matplotlib库(导入图形包),于是尝试用pip安装库 首先,我先更新了pip,如下图: 顺便附上成功截图: 然后安装nu ...
- python画社交网络图
安装依赖包 pip3 install networkx 在图书馆的检索系统中,关于图书的信息里面有一个是图书相关借阅关系图.跟这个社交网络图是一样的,反映了不同对象间的关联性.利用python画社交网 ...
- python画柱状图并且输出到html文件
import matplotlibmatplotlib.use('Agg')import matplotlib.pyplot as pltfrom Cstring import StringIO y ...
随机推荐
- PostgreSQL数据库运行日志
PostgreSQL运行日志可以实现日志输出记录,默认是没有启动记录.这个日志一般是记录服务器与DB的状态,比如各种Error信息,定位慢查询SQL,数据库的启动关闭信息,发生checkpoint过于 ...
- SAP VL02N 字段不允许编辑
METHOD if_ex_le_shp_delivery_proc~change_field_attributes. data: ls_field_attributes type shp_screen ...
- 负载均衡做集群时关于的session不均衡的解决方案
从用户端来解释,就是当一个用户第一次访问被负载均衡代理到后端服务器A并登录后,服务器A上保留了用户的登录信息:当用户再次发送请求时, 根据负载均衡策略可能被代理到后端不同的服务器,例如服务器B,由于这 ...
- 01_windows、linux互ping不通解决方式
一.NAT设置(NAT模式可访问公网,可连接本机,不可访问局域网) 1.编辑-->虚拟网络编辑器 2.设置NAT模式 二.配置Linux静态ip地址 1.命令:setup 2.配置完毕重启网卡: ...
- v-if和v-show最重要一点
vif是新建与销毁标签 show是显示与隐藏标签 如果涉及到权限操作的话 必须使用vif 因为vshow中把标签改成display:none的话可以手动改成显示
- Vue项目使用/deep/报错:SassError: expected selector解决方案--亲测有效
项目npm run dev报错如下: 解决方法: 尝试用 ::v-deep 替换 /deep/ ,成功解决了问题. 效果如下图所示(完美解决~) 某些预处理器(例如Sass)可能无法>>& ...
- nginx 使用ssl证书配置https协议
如果能给你带来帮助,不胜荣幸,如果有错误也请批评指正,共同学习,共同进步. 第一,需要去申请或者购买ssl证书(这步略过,因为开发过程中没有给我提供证书和域名,只有ip地址),我从网上找了一份如何申请 ...
- 阿里巴巴Java代码规范(一)
现代软件架构都需要协同开发完成,高效协作即降低协同成本,提升沟通效率,所谓无规矩不成方圆,无规范不能协作. 本博客是对<阿里巴巴Java开发手册>的学习记录.大多记录的是强制规约,具体请参 ...
- K8S部署之kubeadm
K8S部署笔记 一.集群环境说明 主机名 IP地址 说明 k8s-master01 192.168.1.107 master节点 k8s-master02 192.168.1.108 master节点 ...
- 下载接口时出现:Try to run this command from the system terminal. Make sure that you use the correct version of 'pip' installed for your Python interpreter located at 'D:\python\demo\venv\Scripts\...的错误
下载接口时出现:Try to run this command from the system terminal. Make sure that you use the correct version ...