如何在Python中移除图形元素

2 投票
2 回答
653 浏览
提问于 2025-04-17 10:07

我想在Python中绘制一个没有任何图表元素的3D图形。可以理解为这是一个3D版本的这个

当我运行下面的代码时,得到的是一个普通的图像一个(非常)简化的表面图。 我想去掉坐标轴、坐标轴标签、刻度线和背景,只保留表面。

我该怎么做呢?

另外,有没有办法在图上添加箭头?

这是我的代码:

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()

2 个回答

1

这段话没有回答你问题的很多部分。不过,你可以先用下面的代码关闭一些功能:

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

我在下面做了一些示例。另外,plt.annotate()这个函数是用来在二维图中添加箭头的……我不太确定它是怎么放大的。

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循环都可以避免。

1

要去掉图形中的3D框架,可以使用以下代码:

ax.set_axis_off()

在这里输入图片描述

撰写回答