在 python 中使用 pyqt5 旋转或调整轴刻度的大小

Posted

技术标签:

【中文标题】在 python 中使用 pyqt5 旋转或调整轴刻度的大小【英文标题】:Rotate or resize the axis ticks using pyqt5 in python 【发布时间】:2018-04-30 09:37:36 【问题描述】:

我使用下面的代码

    import sys
    from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout, \
    QLineEdit, QMessageBox, QInputDialog, QLabel, QHBoxLayout, QGridLayout,     QStackedLayout, QFormLayout
    from  PyQt5 import QtCore, QtGui, QtWidgets
    import time
    import matplotlib
    matplotlib.use("TkAgg")
    from matplotlib.lines import Line2D

    import matplotlib.animation as animation
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as     NavigationToolbar
    import matplotlib.pyplot as plt
    from matplotlib.figure import Figure

    # data
    import numpy as np
    #import matplotlib.pyplot as plt
    import pandas as pd
    import os
    import csv




    # percent  MW
   x=['BE2000',
 'BE2020',
 'BE5000',
 'BE6010',
 'BE6017',
 'BE6020',
 'BE6027',
 'BE6030',
 'BE6050',
 'BE6057',
 'BE6061',
 'BE6062',
 'BE6063',
 'BE6070',
 'BE6073',
 'BE6075',
 'BE6080',
 'BE6090',
 'BE7000',
 'BE7010']
y=[0.0002716766988612973,
 0.005178087393490427,
 0.0014053668695097226,
 0.3174139251746979,
 0.006049724003653125,
 0.24824287385322272,
 0.0004986331396716525,
 0.19624266416568525,
 0.13170894569069627,
 0.0028535946936992873,
 0.0002737864422892905,
 0.0011817396106664916,
 0.0029533382584451574,
 0.03281361420815501,
 0.000273411124091493,
 0.002558801432193384,
 0.027004861403488886,
 0.004918720459633545,
 0.006030278629435105,
 0.0002858345295419518]     





    #figure = plt.figure()

    H = np.array([[100, 2, 39, 190], [402, 55, 369, 1023], [300, 700, 8, 412], [170, 530, 330, 1]])
    Z = np.array([[3, 290, 600, 480], [1011, 230, 830, 0], [152, 750, 5, 919], [340, 7, 543, 812]])


    class Window(QDialog):
        def __init__(self, parent=None):
            super(Window, self).__init__(parent)

            # a figure instance to plot on
            self.figure = plt.figure()

            # this is the Canvas Widget that displays the `figure`
            # it takes the `figure` instance as a parameter to __init_
            self.im = None
            self.canvas = FigureCanvas(self.figure)

            self.canvas.mpl_connect('button_press_event', self.on_button_press_event)

            # this is the Navigation widget
            # it takes the Canvas widget and a parent
            self.toolbar = NavigationToolbar(self.canvas, self)

            self.timer = QtCore.QTimer(self)
            self.timer.timeout.connect(self.plot)
            self.timer.setInterval(500)

            # Just some button connected to `plot` method
            self.button = QPushButton('Plot')
            self.button.clicked.connect(self.timer.start)
            self.button.setDefault(False)

            self.stop = QPushButton("Stop")
            self.stop.clicked.connect(self.timer.stop)
            self.stop.setDefault(False)

            self.exit = QPushButton('Exit')
            self.exit.clicked.connect(self.close)
            self.exit.setDefault(True)




            # set the layout
            layout = QFormLayout()
            layout.addWidget(self.toolbar)
            layout.addWidget(self.canvas)
            layout.addWidget(self.button)
            layout.addWidget(self.stop)
            layout.addWidget(self.exit)


            self.setLayout(layout)

            self.lb = QtWidgets.QLabel(self)
            self.lb.setWindowFlags(QtCore.Qt.ToolTip)



        def plot(self):
            data=x
            self.setWindowTitle("Bestandseingruppierung")

            # instead of ax.hold(False)
            self.figure.clear()

            # create an axis
            ax = self.figure.add_subplot(111)
            plt.setp(ax.get_xticklabels(), rotation=45)
            #fig.autofmt_xdate()
            # discards the old graph
            ax.hold(False) # deprecated, see above

            # plot data
            ax.axes.bar(data,y)
            self.canvas.draw()




        def on_button_press_event(self, event):
            print('button=, x=, y=, xdata=, ydata='
                .format(event.button, event.x, event.y, event.xdata, event.ydata))
            if self.im:
                message = str(self.im.get_cursor_data(event))
                delay = 1000
                w = self.lb.fontMetrics().width(message)
                self.lb.resize(w, self.lb.size().height())
                self.lb.setText(message)
                self.lb.move(QtGui.QCursor.pos())
                self.lb.show()
                QtCore.QTimer.singleShot(delay, self.lb.hide)




    if __name__ == '__main__':
        app = QApplication(sys.argv)

        main = Window()
        main.show()

        sys.exit(app.exec_())

生成动态条形图。现在剧情有问题了。 .

我尝试ax.set_xticklabels 将 x 轴上的刻度旋转到两个不同的位置:

1) 直接在创建图之后:

 class Window(QDialog):
        def __init__(self, parent=None):
            super(Window, self).__init__(parent)
            # a figure instance to plot on
            self.figure = plt.figure()
            self.figure.set_xticklabels(rotation=45)

这会产生错误。

2) 作为第二次尝试,我将其放入

def plot(self):
        data=x
        self.setWindowTitle("Bestandseingruppierung")
        # instead of ax.hold(False)
        self.figure.clear()

        # create an axis
        ax = self.figure.add_subplot(111)
        ax.set_xticklabels(rotation=45)
        #fig.autofmt_xdate()
        # discards the old graph
        ax.hold(False) # deprecated, see above

        # plot data
        ax.axes.bar(data,y)
        self.canvas.draw()

在这种情况下,我得到了没有任何错误但没有任何旋转的旧情节!

我想知道我应该放置哪些选项以及在哪里可以使用 pyqt5 旋转刻度或调整刻度或标签的大小!

【问题讨论】:

旋转刻度与 PyQt 无关。您可以旋转标签,如本网站上其他问题所示,例如通过ax.tick_params(axis="x", labelrotation=45)plt.setp(ax.get_xticklabels(), rotation=45) 等。 我应用了你的建议,'plt.setp(ax.get_xticklabels(), rotation=45)',而不是 'ax.set_xticklabels(rotation=45)' ,但是我得到了相同的情节。大概是我用错地方了吧?! 我不这么认为,尽管没有minimal reproducible example 就无法测试。 @ImportanceOfBeingErnest:我发布了一个链接(此代码),这也是我的问题。如果您愿意,我可以再次发布整个代码。但是,我使用相同的代码。我应该将整个代码发布在链接(此代码)下吗? 问题是需要从不同的地方收集不同的代码片段。如果说该链接问题的答案具有完整的代码可复制和可粘贴,那也足够了。 【参考方案1】:

您的第二次尝试非常接近正确的方式!

只需将您的 x-labels 添加到 ax.set_xticklabels(rotation=45) 作为第一个位置参数。

所以,复制这行代码并将其放入您的第二次尝试中:

ax.set_xticklabels(labels=xlabels, rotation=45)

其中 xlabels = 您的 x 轴标签列表

【讨论】:

以上是关于在 python 中使用 pyqt5 旋转或调整轴刻度的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 nvd3 在柱形图上定位旋转的 x 轴标签?

使用OpenGL如何实现物体绕体外任意轴旋转?

Python PyQt5 - 向表中添加行

如何在不使用paintEvent的情况下旋转PyQt5 QPushButton?

如何在不使用 transform.Rotate 的情况下在其本地或世界轴上旋转带有第二个四元数的四元数?

PyQt5调整应用程序以适应不同的显示