matplotlib 如何通过复选框打开/关闭所有轴,文本绘制?

pbwdgjma  于 2023-11-22  发布在  其他
关注(0)|答案(1)|浏览(93)

这是我在这里的第一个问题!.我是新的Python,我专注于我的学习编程最简单的任务,我已经在MatLab脚本前一段时间,所以我可以比较,并确保我的Python脚本是工作.我还没有能够做一个简单的事情:我可以通过复选框在图中关闭/打开绘制点,但是我还不能用与这些点相关的标签来绘制文本。我可以看到问题是ax.text在For循环中被调用/分配给line 2,然后它只取最后分配的ax. text。这在Matlab中有一个简单的解决方案,它应该将每个ax.text存储在单元格上,然后像单元格一样调用它以关闭它。on.我一直在python上搜索相同的东西,到现在还没有运气.任何建议或阅读将非常感谢.谢谢!

x = np.random.randint(1,10,10)
y = np.random.randint(1,10,10)
z = np.random.randint(1,10,10)

tag = np.ones(len(x)).astype(str)

fig = plt.figure(figsize=(12,9))
ax = fig.add_subplot(1,1,1, projection='3d')

line1 = ax.scatter(x,y,z,'o',visible = True)

for sid, x, y, z in zip(tag, x, y, z):

    line2 = ax.text(x+0.01*x, y, z, sid, None, visible = True)

lines =  [line1, line2]
rax = plt.axes([0.8, 0.05, 0.1, 0.15])
labels = ['DOTS','TEXT']
visibility = [True,True]
check = CheckButtons(rax, labels, visibility)

def func(label):
    index = labels.index(label)
    lines[index].set_visible(not lines[index].get_visible())
    plt.draw()

check.on_clicked(func)

plt.show()

字符串

nxowjjhe

nxowjjhe1#

正如你提到的,line2只有最后的文本信息。似乎没有办法在同一时间注解多个文本。所以只要使用for循环来改变每一个按钮按下。这段代码工作。注意,我使用dic来使未知数量的点,它可能是棘手的。

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

def func(label):
    index = labels.index(label)
    if index == 0:
        lines[index].set_visible(not lines[index].get_visible())
    elif index == 1:
        for i in dic:  # change text one by one
            dic[i].set_visible(not dic[i].get_visible())
    plt.draw()

x = np.random.randint(1, 10, 10)
y = np.random.randint(1, 10, 10)
z = np.random.randint(1, 10, 10)

tag = np.ones(len(x)).astype(str)

fig = plt.figure(figsize=(12, 9))
ax = fig.add_subplot(1, 1, 1, projection="3d")

line1 = ax.scatter(x, y, z, "o", visible=True)

# make a variable with a name in every iteration
# and plot text first time
dic = {}
for num, sid, x, y, z in zip(range(len(tag)), tag, x, y, z):
    dic["var{0}".format(num)] = ax.text(x + 0.01 * x, y, z, sid, None, visible=True)

lines = [line1]  # dropped line2
rax = plt.axes([0.8, 0.05, 0.1, 0.15])
labels = ["DOTS", "TEXT"]
visibility = [True, True]
check = CheckButtons(rax, labels, visibility)

check.on_clicked(func)

plt.show()

字符串

相关问题