在 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 旋转或调整轴刻度的大小的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用paintEvent的情况下旋转PyQt5 QPushButton?