使用轮廓绘制时尝试调整数据范围时得到奇怪的结果
import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)
plt.figure()
CS = plt.contourf(X, Y, Z, vmin = 0, vmax = 3)
plt.title('Simplest default with labels') …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Matplotlib中的FuncAnimation类保存我创建的动画.我的动画更复杂,但是当我尝试保存这里给出的简单示例时,我得到了同样的错误.
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
pause = False
def simData():
t_max = 10.0
dt = 0.05
x = 0.0
t = 0.0
while t < t_max:
if not pause:
x = np.sin(np.pi*t)
t = t + dt
yield x, t
def onClick(event):
global pause
pause ^= True
def simPoints(simData):
x, t = simData[0], simData[1]
time_text.set_text(time_template%(t))
line.set_data(t, x)
return line, time_text
fig = plt.figure()
ax = fig.add_subplot(111)
line, = ax.plot([], [], …Run Code Online (Sandbox Code Playgroud) 假设我有以下数据框:
df1 = pd.DataFrame(data = [1,np.nan,np.nan,1,1,np.nan,1,1,1],
columns = ['X'],
index = ['a', 'a', 'a',
'b', 'b', 'b',
'c', 'c', 'c'])
print(df1)
X
a 1.0
a NaN
a NaN
b 1.0
b 1.0
b NaN
c 1.0
c 1.0
c 1.0
Run Code Online (Sandbox Code Playgroud)
我只想保留具有 2 个或更多非 NaN 条目的索引。在这种情况下,“a”条目只有一个非 NaN 值,所以我想删除它并让我的结果是:
X
b 1.0
b 1.0
b NaN
c 1.0
c 1.0
c 1.0
Run Code Online (Sandbox Code Playgroud)
做这个的最好方式是什么?理想情况下,我也想要一些适用于 Dask 的东西,尽管通常如果它适用于 Pandas,它也适用于 Dask。
我有一个2D形式的日期:
[Y Y Y ... ]
[M M M ... ]
[D D D ... ]
[H H H ... ]
[M M M ... ]
[S S S ... ]
Run Code Online (Sandbox Code Playgroud)
所以它看起来像
data = np.array([
[2015, 2015, 2015, 2015, 2015, 2015], # ...
[ 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 2, 2, 2],
[ 23, 23, 23, 0, 0, 0],
[ 4, 5, 5, 37, 37, 37],
[ 59, 1, 2, 25, 27, 29]
])
Run Code Online (Sandbox Code Playgroud)
将此转换为一个datetime对象列表的最佳方法是什么?
1752年9月,根据1750年日历(新式)法案,1752年9月跳过了11天。这可以通过Unix cal命令看到。
$ cal 9 1752
September 1752
Su Mo Tu We Th Fr Sa
1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Run Code Online (Sandbox Code Playgroud)
在了解了这个事实之后,我想知道 Python 的 datetime 类是否解释了这一点。经过一番快速的尝试后,似乎并没有......
>>> datetime.datetime.now() - datetime.datetime(1752, 9, 14)
datetime.timedelta(96550, 47314, 535334)
>>> datetime.datetime.now() - datetime.datetime(1752, 9, 2)
datetime.timedelta(96562, 47318, 183610)
Run Code Online (Sandbox Code Playgroud)
根据我的理解,如果1752年9月14日是96550天前,那么1752年9月2日应该是96551天前(因为3-13被跳过)。
我还显得好像日历类也没有考虑到跳过
>>> calendar.prmonth(1752, 9)
September 1752
Mo Tu We Th Fr Sa Su
1 2 3
4 5 6 7 8 9 …Run Code Online (Sandbox Code Playgroud) 这是这里提出的问题的扩展(引用如下)
我有一个矩阵(准确地说是二维 numpy ndarray):
Run Code Online (Sandbox Code Playgroud)A = np.array([[4, 0, 0], [1, 2, 3], [0, 0, 5]])我想根据另一个数组中的滚动值独立滚动 A 的每一行:
Run Code Online (Sandbox Code Playgroud)r = np.array([2, 0, -1])也就是说,我想这样做:
Run Code Online (Sandbox Code Playgroud)print np.array([np.roll(row, x) for row,x in zip(A, r)]) [[0 0 4] [1 2 3] [0 5 0]]有没有办法有效地做到这一点?也许使用花哨的索引技巧?
接受的解决方案是:
rows, column_indices = np.ogrid[:A.shape[0], :A.shape[1]]
# Use always a negative shift, so that column_indices are valid.
# (could also use module operation)
r[r < 0] += A.shape[1]
column_indices = column_indices - r[:,np.newaxis]
result = A[rows, …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi/2, np.pi/2, 30)
y = np.linspace(-np.pi/2, np.pi/2, 30)
x,y = np.meshgrid(x,y)
z = np.sin(x**2+y**2)[:-1,:-1]
fig,ax = plt.subplots()
ax.pcolormesh(x,y,z)
Run Code Online (Sandbox Code Playgroud)
现在假设我想突出显示某些网格框的边缘:
highlight = (z > 0.9)
Run Code Online (Sandbox Code Playgroud)
我可以使用轮廓功能,但这会导致“平滑”轮廓。我只想在网格框的边缘之后突出显示区域的边缘。
我最接近的是添加这样的东西:
highlight = np.ma.masked_less(highlight, 1)
ax.pcolormesh(x, y, highlight, facecolor = 'None', edgecolors = 'w')
Run Code Online (Sandbox Code Playgroud)
这很接近,但我真正想要的是只突出显示“甜甜圈”的外边缘和内边缘。
所以基本上我正在寻找一些轮廓和 pcolormesh 函数的混合体 - 一些遵循某些值的轮廓的东西,但在“步骤”中遵循网格箱而不是点对点连接。那有意义吗?
旁注:在 pcolormesh 参数中,我有edgecolors = 'w',但边缘仍然是蓝色的。怎么回事?
编辑:
JohanC 使用 add_iso_line() 的初始答案适用于提出的问题。但是,我使用的实际数据是非常不规则的 x,y 网格,无法转换为 1D(如add_iso_line().
我正在使用从极坐标 (rho, phi) 转换为笛卡尔坐标 (x,y) …
我使用 cartopy 创建了一个开放街道地图图:
from __future__ import division
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.io.img_tiles as cimgt
request = cimgt.OSM()
extent = [-89, -88, 41, 42]
ax = plt.axes(projection=request.crs)
ax.set_extent(extent)
ax.add_image(request, 8)
plt.show()
Run Code Online (Sandbox Code Playgroud)
现在我还有一个经度和纬度点列表。如何在街道地图上覆盖这些经度和纬度点的热图?
我试过使用 hist2d,但这不起作用。
lons = (-88 --89)*np.random.random(100)+-89
lats = (41 - 42)*np.random.random(100)+42
ax.hist2d(lons,lats)
plt.show()
Run Code Online (Sandbox Code Playgroud)
但这不起作用。
我猜我必须在绘图命令中的某个地方抛出一个转换参数?但我不确定如何去做。
谢谢!
我有一个 NetCDF 文件列表,我想用该xarray.open_mfdataset函数打开它们。
这通常是微不足道的,但是我遇到了一个问题,因为我尝试打开的文件中不包含任何“时间”维度:
data
Out[51]:
<xarray.Dataset>
Dimensions: (lat: 850, lon: 1500)
Coordinates:
* lat (lat) float64 54.98 54.94 54.9 54.86 ... 21.14 21.1 21.06 21.02
* lon (lon) float64 -126.0 -125.9 -125.9 -125.9 ... -66.1 -66.06 -66.02
Data variables:
Data (lat, lon) float32 ...
Run Code Online (Sandbox Code Playgroud)
当我尝试使用 open_mfdataset 打开文件列表时,我当然会收到错误:
xr.open_mfdataset(files)
ValueError: Could not find any dimension coordinates to use to order the datasets for concatenation
Run Code Online (Sandbox Code Playgroud)
不过,我确实有一个与每个文件对应的日期列表:
dates
Out[54]:
array([datetime.datetime(2009, 1, 1, 0, 0),
datetime.datetime(2009, 1, 2, 0, 0),
datetime.datetime(2009, …Run Code Online (Sandbox Code Playgroud) 有没有办法增加 matplotlib 流图上的箭头数量?现在看来,每个流线中的 3 个箭头只有一个箭头,如果我想更改 x/y 轴限制以放大数据,这就是一个问题。
可以说我有一些2D阵列 a = np.ones((3,3))
我想将这个数组拉伸成3维.我有一个数组b,大小相同a,它提供了第三维中的索引,每个对应的元素也a需要去.
我也有c充满NaN的3D阵列.这是a应该放入信息的数组.剩余的空白空间没有被填满:可以保留NaNs.
>>> a = np.ones((3,3))
>>> b = np.random.randint(0,3,(3,3))
>>> c = np.empty((3,3,3))*np.nan
>>>
>>> a
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
>>> b
array([[2, 2, 2],
[1, 0, 2],
[1, 0, 0]])
>>> c
array([[[ nan, nan, nan],
[ nan, nan, nan],
[ nan, nan, nan]],
[[ nan, nan, nan],
[ nan, nan, nan],
[ nan, nan, nan]], …Run Code Online (Sandbox Code Playgroud)