Matplotlib axes3d, как использовать график всего пространства окнаPython

Программы на Python
Ответить
Anonymous
 Matplotlib axes3d, как использовать график всего пространства окна

Сообщение Anonymous »

У меня есть приложение на Python, которое встраивает matplotlib.Axes3d в QWidget для рисования 3D-кривых.
Проблема в том, что при изменении размера или в окне много места matplotlib обрезает график, как показано на изображении ниже.
Я попробовал set_box_aspect, плотно_layout, set_x/y/z/margin , fig.subplots_adjust(left=0, right=1, low=0, top=1) и изменил размер figsize и dpi, но ничего не помогло.
Я думаю, что это как-то связано с матрицей проекции и плоскостью отсечения/усеченной пирамидой.
Как я могу использовать все пространство окна?
Изображение

Вот простой пример. Окно matplotlib не заполняет все окно.

Вы также можете удалить set_x/y/zlim3d, удерживая нажатой правую кнопку мыши и перетаскивая ее вниз. Вы можете играть, чтобы увеличить масштаб.
import sys

import numpy as np
from matplotlib.backends.backend_qtagg import FigureCanvas
from matplotlib.figure import Figure
from mpl_toolkits.mplot3d import axes3d
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QApplication, QHBoxLayout,QMainWindow,QVBoxLayout,QWidget)

class ApplicationWindow(QMainWindow):
def __init__(self, parent=None):
QMainWindow.__init__(self, parent)

# Central widget
self._main = QWidget()
self.setCentralWidget(self._main)

# Figure
self.fig = Figure(dpi=100)
self.canvas = FigureCanvas(self.fig)

# Main layout
layout = QHBoxLayout(self._main)
layout.addWidget(self.canvas, 88)

# Initial setup
self.fig.set_canvas(self.canvas)
self._ax = self.canvas.figure.add_subplot(projection="3d")
self.plot_wire()
self._ax.view_init(30, 30)

self._ax.set_xlim3d((-21.256550924241655, 20.956550924241274))
self._ax.set_ylim3d((-21.256550924241655, 20.956550924241274))
self._ax.set_zlim3d((-45.123979156988995, 56.69315358068454))
self.fig.canvas.mpl_connect('button_press_event',self.onPress)

def onPress(self,event):
print('pressed')

def plot_wire(self):
# Data
self.X, self.Y, self.Z = axes3d.get_test_data(0.03)
self._ax.plot_wireframe(self.X, self.Y, self.Z, rstride=10, cstride=10, cmap="viridis")
self.canvas.draw()

if __name__ == "__main__":
app = QApplication(sys.argv)
w = ApplicationWindow()
w.show()
app.exec()


Подробнее здесь: https://stackoverflow.com/questions/798 ... e-plotting
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»