【问题标题】:how to remove plot elements in python如何在python中删除绘图元素
【发布时间】:2012-01-12 21:36:21
【问题描述】:

我正在尝试在 python 中没有任何绘图元素的 3d 图形。 this 的 3d 版本。

当我运行我在下面添加的代码时,我得到了常规的 plot。 我想删除坐标轴、坐标轴标签、刻度和背景(并且只保留表面)。

我怎样才能删除它们。

另外,有没有办法在情节中添加箭头?

这是我的代码:

import random
import math

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

pi = 3.14159
bignum = 3
amp = 0.1

mat = []
X = []
Y = []
class mode:
    i=0
    j=0
    phase=0
    amp=0
modes = dict() 
for i in range(0,3):
    submodes = dict()
    for j in range (0,5):
        if not (i==0 and j==2):
            m = mode()
            m.i = i
            m.j = j
            m.amp = amp*random.random()/(pow(i,2) + pow(j-2,2))
            m.phase = random.random()*2*pi
            submodes[j] = m
            modes[i] = submodes

for x in range (0,bignum): 
    mat.append([])
    for y in range (0,bignum):
        dz = 0
        for i in range (0,3):
            for j in range (0,5):
                if not (i == 0 and j == 2):
                    dz += math.cos(i*x*2*pi/bignum + j *y*2/bignum + modes[i][j].phase)*modes[i][j].amp
        mat[x].append(dz)

X = np.mgrid[:bignum,:bignum]
print (len(X[0]))
print (len(mat))
fig = plt.figure(figsize=plt.figaspect(2.))
fig.frameon=True

ax = fig.add_subplot(1,1,1, projection='3d')
ax.frameon=False
ax.xticks=[]
ax.yticks=[]
ax.zticks=[]
surf = ax.plot_surface(X[0],X[1],mat,rstride=1, cstride=1,
        linewidth=0, antialiased=False)
ax.set_zlim3d(0, 1)
plt.show()

【问题讨论】:

  • 并不是说这不是主题(因为它不是),但这种问题也适合Computational Science,它会受益于更专注于科学计算的观众。

标签: python numpy matplotlib


【解决方案1】:

要从图中消除 3d 框架,请使用:

ax.set_axis_off()

【讨论】:

  • 添加这个,你会得到一个完全灰色的背景plt.setp(ax.get_frame(), visible = False)。至少你应该使用 ndarrays 而不是 dict,向量化确实需要时间来学习,但可以在大型数据集上为你节省
【解决方案2】:

这并不能回答您的大部分问题。但是你可以开始关闭东西

plt.setp(ax.get_xticklabels(), visible=False)

我在下面做了一些。此外,plt.annotate() 函数是如何在 2d 图中添加箭头...不确定它是如何放大的。

import random
import math

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

pi = 3.14159
bignum = 3
amp = 0.1

mat = []
X = []
Y = []
class mode:
    i=0
    j=0
    phase=0
    amp=0
modes = dict() 
for i in range(0,3):
    submodes = dict()
    for j in range (0,5):
        if not (i==0 and j==2):
            m = mode()
            m.i = i
            m.j = j
            m.amp = amp*random.random()/(pow(i,2) + pow(j-2,2))
            m.phase = random.random()*2*pi
            submodes[j] = m
            modes[i] = submodes

for x in range (0,bignum): 
    mat.append([])
    for y in range (0,bignum):
        dz = 0
        for i in range (0,3):
            for j in range (0,5):
                if not (i == 0 and j == 2):
                    dz += math.cos(i*x*2*pi/bignum + j *y*2/bignum + modes[i][j].phase)*modes[i][j].amp
        mat[x].append(dz)

X = np.mgrid[:bignum,:bignum]
print (len(X[0]))
print (len(mat))
fig = plt.figure(figsize=plt.figaspect(2.))
fig.frameon=True

ax = fig.add_subplot(1,1,1, projection='3d')
ax.frameon=False

surf = ax.plot_surface(X[0],X[1],mat,rstride=1, cstride=1,
        linewidth=0, antialiased=False)
ax.set_zlim3d(0, 1)
plt.setp(ax.get_xticklabels(), visible=False)
plt.setp(ax.get_yticklabels(), visible=False)
plt.setp(ax.get_zticklabels(), visible=False)
plt.setp(ax.get_xticklines(), visible=False)
plt.setp(ax.get_yticklines(), visible=False)
plt.setp(ax.get_zticklines(), visible=False)
plt.setp(ax.get_frame(), visible = False)
#plt.annotate(r'Hello', xy = (.5, .5),
#                xytext = (10,10),
#                textcoords='offset points', arrowprops=dict(arrowstyle='->',
#                                                connectionstyle='arc3,rad=0'))

plt.show()

你没有问这个......但你应该矢量化这段代码。大多数/(全部?) for 循环都可以避免。

【讨论】:

  • 谢谢。我知道我应该避免循环,但我看不出如何在这里逃脱它们。主要是 i 和 j 的幂。
猜你喜欢
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2022-07-25
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 2021-04-08
相关资源
最近更新 更多