我只是试图用3D绘制曲面及其轮廓,就像在这个例子中一样.
这是我用来做的代码:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from matplotlib import cm
import numpy
def plot_3d_contour(x_dim, y_dim, x_steps, y_steps, scalar_field, file_path):
fig = plt.figure()
x, y = numpy.mgrid[-x_dim/2:x_dim/2:x_steps*1j, -y_dim/2:y_dim/2:y_steps*1j]
v_min = numpy.min(scalar_field)
v_max = nupmy.max(scalar_field)
ax = fig.gca(projection='3d')
cset = ax.contourf(x, y, scalar_field, zdir='z', offset=v_min, cmap=cm.coolwarm)
cset = ax.contourf(x, y, scalar_field, zdir='x', offset=-x_dim/2-1, cmap=cm.coolwarm)
cset = ax.contourf(x, y, scalar_field, zdir='y', offset=y_dim/2+1, cmap=cm.coolwarm)
ax.plot_surface(x, y, scalar_field, rstride=10, cstride=10, alpha=0.3)
ax.set_xlabel('X')
ax.set_xlim(-x_dim/2-1, x_dim/2+1)
ax.set_ylabel('Y')
ax.set_ylim(-y_dim/2-1, y_dim/2+1)
ax.set_zlabel('Z')
ax.set_zlim(v_min, …Run Code Online (Sandbox Code Playgroud) 我在分层和zorderpython中苦苦挣扎.我正在使用带有三个相关元素的matplotlib进行3D绘图:surface_plot一个行星的A ,一个surface_plot围绕该行星的环,以及一个contourf显示行星的阴影投射到环上的图像.
我希望图形能够精确地显示这种情况在现实生活中的样子,环绕着行星,阴影位于相应位置的环上.如果影子在给定POV的行星后面,我希望阴影被行星阻挡,反之亦然,如果阴影位于行星前面,对于给定的POV.
需要说明的是,这只是一个分层问题.我的行星,戒指和阴影都正确地绘制.但是,阴影永远不会显示在地球的前面.它就好像行星正在"阻挡"阴影,即使行星在层次方面应该位于阴影之下.
我已经尝试了我能想到的每一件事,zorder并重新排列调用各种绘图元素的顺序.环DO正确地显示在行星前面,但阴影不会.
我的实际代码很长.这里是相关部分:
绘图设置:
def setup_saturn_plot(ax3, elev, azim, drawz, drawxy,view):
ax3.set_aspect('equal','box')
ax3.view_init(elev=elev, azim=azim)
if(view=="top" or view == "Top" or view == "TOP"):
ax3.dist = 5.5
if(view=="star" or view == "Star" or view == "STAR"):
ax3.dist = 5.0 #4.5 is best value
proj3d.persp_transformation = orthographic_proj
# hide grid and background
ax3.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
ax3.w_yaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
ax3.w_zaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
ax3.grid(False)
# hide z axis in …Run Code Online (Sandbox Code Playgroud) 我正在尝试在matpllotlib contourf图上自定义颜色条.虽然我能够使用科学记数法,但我试图改变符号的基础 - 主要是因为我的刻度将在(-100,100)而不是(-10,10)的范围内.
例如,这会产生一个简单的情节......
import numpy as np
import matplotlib.pyplot as plt
z = (np.random.random((10,10)) - 0.5) * 0.2
fig, ax = plt.subplots()
plot = ax.contourf(z)
cbar = fig.colorbar(plot)
cbar.formatter.set_powerlimits((0, 0))
cbar.update_ticks()
plt.show()
Run Code Online (Sandbox Code Playgroud)
像这样:
但是,我希望颜色条上方的标签为1e-2,数字范围为-10到10.
我该怎么做?
我试图用两个不同的contourf子图来制作一个使用完全不同的colormap的图.但是,对于我目前拥有的代码(为其中一个子图创建自定义颜色图),子图使用相同的颜色图.任何想法如何解决这一问题?
h = figure;
subplot(2,1,1)
title('GEFS 20 Member Mean Vorticity');
axesm('eqdcylin','maplonlimit',[-180 179],'maplatlimit',[0 90]);
%eqdcylin
contourm(gLat, gLon, squeeze(meanhx(x,:,:))', 16,'Color',[0.05 0.05 0.05],'LineWidth',2);
hold on
contourfm(gLat, gLon, squeeze(vmeanx(x,:,:))', 30, 'LineStyle', 'none');
shading flat;
lm=worldlo('POline');
for i=1:length(lm);
lm(i).otherproperty = {'color','m','LineWidth',1.5};
end
displaym(lm);
gridm on;
tightmap;
set(h, 'Position', [1 1 2200 1100]);
colormap(b2r(-5*10^-5, 5*10^-5));
freezeColors;
cbfreeze(colorbar)
%caxis([-5*10^-5 5*10^-5])
colorbar;
subplot(2,1,2)
title('GEFS 20 Member Vorticity Variance');
axesm('eqdcylin','maplonlimit',[-180 179],'maplatlimit',[0 90]);
%eqdcylin
contourm(gLat, gLon, squeeze(meanhx(x,:,:))', 16,'Color',[0.05 0.05 0.05],'LineWidth',2);
hold on
contourfm(gLat, gLon, squeeze(vvarx(x,:,:))', 30, 'LineStyle', 'none');
shading flat; …Run Code Online (Sandbox Code Playgroud) 我想更新contourf函数内的绘图,效果很好。然而,数据的范围发生了变化,因此我还必须更新颜色条。这就是我未能做到的地方。
请参阅以下最小工作示例:
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111)
# Random data
data = np.random.rand(10, 10)
# Plot data
levels = np.linspace(0., 1., 100)
plot = ax.contourf(data, levels=levels)
clist = plot.collections[:]
# Create colorbar
cbar = plt.colorbar(plot)
cbar_ticks = np.linspace(0., 1., num=6, endpoint=True)
cbar.set_ticks(cbar_ticks)
plt.show()
def update():
# Remove old plot
for c in clist:
ax.collections.remove(c)
clist.remove(c)
# Create new data and plot
new_data = 2.*np.random.rand(10, 10)
new_levels = np.linspace(0., 2., …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 matplotlib (当然还有 numpy)绘制轮廓图。它有效,它绘制了它应该绘制的内容,但不幸的是我无法设置颜色条范围。问题是我有很多图,并且需要所有图都具有相同的颜色条(相同的最小值和最大值,相同的颜色)。我复制并粘贴了在互联网上找到的几乎所有代码片段,但没有成功。到目前为止我的代码:
import numpy as np;
import matplotlib as mpl;
import matplotlib.pyplot as plt;
[...]
plotFreq, plotCoord = np.meshgrid(plotFreqVect, plotCoordVect);
figHandler = plt.figure();
cont_PSD = plt.contourf(plotFreq, plotCoord, plotPxx, 200, linestyle=None);
normi = mpl.colors.Normalize(vmin=-80, vmax=20);
colbar_PSD = plt.colorbar(cont_PSD);
colbar_PSD.set_norm(normi);
#colbar_PSD.norm = normi;
#mpl.colors.Normalize(vmin=-80, vmax=20);
plt.axis([1, 1000, -400, 400]);
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,颜色条规范有三种不同的行,但它们都不起作用。范围仍然是自动设置的...我的意思是其他一切都正常,为什么颜色条不行?我什至没有收到错误或警告。
谢谢,itpdg
编辑1:图片,与plt.clim(-80,20):
我有一个磁盘的 3D 图。现在我想根据数组中存储的值以颜色绘制表面。例如圆盘的半径是300mm。该数组可能是这样的:
arr = np.array([[ 114.28, 14],
[ 128.57, 16],
[ 142.85,19],
[ 157.13,20],
[ 171.41,21],
[ 185.69,22],
[ 199.97,24],
[ 214.25,27],
[ 228.53,29],
[ 242.81,30],
[ 257.09,31],
[ 271.37,34],
[ 288.65,35],
[ 299.93,36],
[ 300,38]])
Run Code Online (Sandbox Code Playgroud)
这意味着对于半径 = 114.28,我的值为 14。我想以某种颜色(例如蓝色)在半径 114.28 处绘制一个圆。第二个半径是 128.57。对于半径 128.57,分配值 16。这意味着我想用另一种颜色绘制一个圆圈,例如在图的表面上绘制橙色等等。
我尝试用轮廓图解决这个问题(感谢bazingaa)。它看起来正是我想要的。不幸的是,我刚刚意识到这并不是真正解决我的问题。也许我应该解释一下我想要实现的目标。我想展示某些参数(例如速度)如何沿光盘分布。在这种情况下,随着速度向外侧增加,等高线图也会纠正。但也可能发生这样的情况:参数必须可视化,而这些参数并不总是向外部持续增加。我尝试了这种情况,只是在数组中间设置了一个比之前的值更小的值(我将值 27 从 arr 更改为 14),除了图例发生变化之外,等高线图中没有任何反应。也许轮廓图毕竟不是正确的方法?也许我必须绘制单独的圆圈并为其指定颜色,并在圆圈之间进行插值以填补空白。

import numpy as np
import matplotlib as mlp
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d
ri = 100
ra = 300
h=20
# input xy coordinates
xy …Run Code Online (Sandbox Code Playgroud) 我有一些数据要显示为等高线图,其中包含值的对数刻度(矩阵Z)和标记的计数。这就是我的做法:
[C, h1] = contourf(X, Y, log(Z));
clabel(C,h1);
Run Code Online (Sandbox Code Playgroud)
这是我的结果:
我的问题是:如何在轮廓上获得正确的标签?我不想要这里描述的颜色条。
编辑:这是我的例子:
X = 1:1:20;
Y = X;
Z = zeros(size(Y));
for i = 1:size(Y,2);
Z(i, :) = 10^i;
end
[C, h1] = contourf(X, Y, Z);
clabel(C,h1);
Run Code Online (Sandbox Code Playgroud)
我可以设置我想要的任何计数线标签,但它们将不可见,因为我的数据是指数级的(顺便说一下,在这个图中可见的标签是真实的,我想在下一个情节)。
现在,由于我的数据是指数形式,我必须在显示值(矩阵 Z)上使用对数刻度来正确显示数据。这是我的方法(也许还有另一种更好的方法,我不知道,我还没有找到其他任何东西):
[C, h1] = contourf(X, Y, log(Z));
clabel(C,h1);
Run Code Online (Sandbox Code Playgroud)
现在看起来不错——你可以看到我的数据是如何变化的。然而,标签是错误的。我现在可以将它们设置为您喜欢的任何向量:
理想情况下,我希望能够像这样:
[C, h1] = contourf(X, Y, Z, 'ZScale', 'Log');
clabel(C,h1);
Run Code Online (Sandbox Code Playgroud)
并在底部获取带有标签 10、10^5、10^10 等的图片。
总而言之,我需要执行以下操作之一:
找到一种以编程方式设置对数刻度的方法,让 matlab 担心等值线。
能够在不移动它们的情况下手动更改等值线上的标签(new_label = …
我使用的代码如下。但是当我在 MATLAB R2014a 和 R2019a(在同一台计算机,Win7 64 位)中运行我的代码时,数字是不同的。MATLAB R2019a中的函数'ShowText'和'LineStyle'函数之间似乎存在冲突contourf?我想要的是带有文本且没有线条的图形(如 R2014a 的图形)。我怎样才能在 R2019a 中获得它?
for i = 1 : 10
for j = 1 : 10
res(i, j) = i * j;
end
end
contourf(res, 'ShowText', 'on', 'LineStyle', 'none');
Run Code Online (Sandbox Code Playgroud)
图使用 R2014a

图使用 R2019a

图使用 R2019acontourf(res, 'ShowText', 'on')只使用
