如何将 y 轴刻度标签设置在固定位置,以便当我向左或向右滚动时 y 轴刻度标签应该可见?

2024-01-31

在我的程序中,我首先绘制了图形,然后将图形导入到画布中。然后我将画布导入滚动区域。当我运行我的程序时,如果我向左滚动,yaxis 刻度标签会隐藏,或者我向右转动,yaxis 刻度标签也会隐藏。 我已经采取了两个轴。轴,轴2。我已经设置了axes2.yaxis.tick_right()和axes.yaxis.tick_right()。

我希望 y 轴刻度标签将保持在右侧并且始终可见,无论我向左或向右滚动。

import sys
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
from matplotlib.figure import Figure
from PyQt5.QtWidgets import QMainWindow,QVBoxLayout
from PyQt5.QtWidgets import QApplication
from PyQt5 import QtCore, QtGui, QtWidgets
import datetime
from matplotlib.dates import num2date, date2num
from mpl_finance import candlestick_ochl as candlestick
import numpy as np
import matplotlib.ticker as ticker
import matplotlib.dates as mdates
import pylab as pl
class MainWindow_code_serarch(object):

    def setup_code_serarch(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(870, 680)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayoutWidget1 = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget1.setGeometry(QtCore.QRect(17, 30, 741, 13))
        self.verticalLayoutWidget1.setObjectName("verticalLayoutWidget")
        self.verticalLayout1 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget1)
        self.verticalLayout1.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout1.setObjectName("verticalLayout1")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(17, 10, 940, 603))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.figure = Figure(figsize=(100,7.2), dpi=80, facecolor='k')
        self.canvas = FigureCanvas(self.figure)
        self.widget = QtWidgets.QWidget()
        self.scroll_area = QtWidgets.QScrollArea(self.widget)
        self.scroll_area.setWidget(self.canvas)
        self.verticalLayout.addWidget(self.scroll_area)
        axes,axes2 = self.figure.subplots(nrows=2, sharex=True)
        data = {
            'date': ['2018/10/30', '2018/11/03', '2018/11/04', '2018/11/05', '2018/11/07', '2018/11/10', '2018/11/11'],
            'open': [8824, 8726.31, 8642.14, 8531.51, 8630.25, 8602.50, 8640.22],
            'high': [8858, 8748.60, 8551.36, 8653.16, 8476.69, 8630, 8570.56],
            'low': [8688, 8743.67, 8550.76, 8449.50, 8631.83, 8602.18, 8743.22],
            'close': [8820, 8747.17, 8550.52, 8553., 8517.10, 8628.78, 8588.52],
            'volume': [17759.56, 120000.17, 18739.52, 38599.50, 16517.10, 17723.78, 15588.52]
        }
        x = date2num([datetime.datetime.strptime(d, '%Y/%m/%d').date() for d in data['date']])
        t= np.arange(len(data['date']))
        candle_trace = zip(t, data['open'], data['high'], data['low'], data['close'], data['volume'])
        candlestick(axes, candle_trace, width=.75, colorup='g', colordown='r')
        axes2.plot(t, [1, 2, 3, 4, 7, 8, 9])
        axes.set_position([0.02, 0.37, 0.88, 0.6])
        axes2.set_position([0.02, 0.15, 0.88, 0.22])
        axes.tick_params(axis='both', color='#ffffff', labelcolor='#ffffff')
        axes.yaxis.tick_right()
        axes2.tick_params(axis='both', color='#ffffff', labelcolor='#ffffff')
        axes2.grid(color='lightgray', linewidth=.5, linestyle=':')
        axes.grid(color='lightgray', linewidth=.5, linestyle=':')
        axes2.yaxis.tick_right()
        axes.autoscale_view()
        axes2.autoscale_view()
        axes.set_facecolor('#041105')
        axes2.set_facecolor('#041105')
        # N = len(dates)
        axes.set_xticks(range(0, len((x)), 1))
        axes.set_xticklabels([mdates.num2date(d).strftime('%b-%d') for d in x])
        axes.set_xticklabels([mdates.num2date(d).strftime('%Y-%m-%d') for d in x])
        axes2.set_xticklabels([mdates.num2date(d).strftime('%Y-%m-%d') for d in x])
        self.canvas.draw()
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 246, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        # self.pushButton.clicked.connect(self.graphShowCode)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        # self.pushButton.setText(_translate("MainWindow", "OK"))
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = MainWindow_code_serarch()
    ui.setup_code_serarch(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Output image: enter image description here

when i turn scroll left output image 2:enter image description here


这是一种方法滚动轴的内容使用 PyQtQtScrollBar。这是通过根据滚动条的值更改轴的限制来完成的。为此,回调QtScrollBar's actionTriggered注册的方法可以更改轴的限制。

import sys
import matplotlib
# Make sure that we are using QT5
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt
from PyQt5 import QtWidgets, QtCore
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import numpy as np

class ScrollableWindow(QtWidgets.QMainWindow):
    def __init__(self, fig, ax, step=0.1):
        plt.close("all")
        if not QtWidgets.QApplication.instance():
            self.app = QtWidgets.QApplication(sys.argv)
        else:
            self.app = QtWidgets.QApplication.instance() 

        QtWidgets.QMainWindow.__init__(self)
        self.widget = QtWidgets.QWidget()
        self.setCentralWidget(self.widget)
        self.widget.setLayout(QtWidgets.QVBoxLayout())
        self.widget.layout().setContentsMargins(0,0,0,0)
        self.widget.layout().setSpacing(0)

        self.fig = fig
        self.ax = ax
        self.canvas = FigureCanvas(self.fig)
        self.canvas.draw()
        self.scroll = QtWidgets.QScrollBar(QtCore.Qt.Horizontal)
        self.step = step
        self.setupSlider()
        self.nav = NavigationToolbar(self.canvas, self.widget)
        self.widget.layout().addWidget(self.nav)
        self.widget.layout().addWidget(self.canvas)
        self.widget.layout().addWidget(self.scroll)

        self.canvas.draw()
        self.show()
        self.app.exec_()

    def setupSlider(self):
        self.lims = np.array(self.ax.get_xlim())
        self.scroll.setPageStep(self.step*100)
        self.scroll.actionTriggered.connect(self.update)
        self.update()

    def update(self, evt=None):
        r = self.scroll.value()/((1+self.step)*100)
        l1 = self.lims[0]+r*np.diff(self.lims)
        l2 = l1 +  np.diff(self.lims)*self.step
        self.ax.set_xlim(l1,l2)
        print(self.scroll.value(), l1,l2)
        self.fig.canvas.draw_idle()


# create a figure and some subplots
fig, ax = plt.subplots()
t = np.linspace(0,3000,101)
x = np.cumsum(np.random.randn(len(t)))
ax.plot(t,x, marker="o")

# pass the figure to the custom window
a = ScrollableWindow(fig,ax)

对于滚动条within该图,参见可滚动条形图 matplotlib https://stackoverflow.com/questions/44791466/scrollable-bar-graph-matplotlib

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 y 轴刻度标签设置在固定位置,以便当我向左或向右滚动时 y 轴刻度标签应该可见? 的相关文章

随机推荐

  • 使用 python 通过迭代列表创建 XML 文件

    我正在尝试获取一个如下所示的 xml 文件 以便我可以将其导入到 Moodle 成绩册中
  • 如何确定递归代码的Big-O?

    我有以下代码 这是这个问题的答案 https leetcode com problems add digits https leetcode com problems add digits class Solution public int
  • 同一图中连续的 matplotlib 动画

    我有一个算法 它由两个不同的部分组成 我想依次可视化这两个部分 同时可能在动画 2 开始时在屏幕上保留动画 1 的最终状态 我可以通过调用分别可视化这两个部分animation FuncAnimation and plt show 由于这两
  • Heroku 资产文件始终为空

    首先 我做了很多谷歌搜索 甚至让 Heroku 上的东西正常工作 但似乎无论我是让 Heroku 在 slug 编译期间预编译我的资产 还是我自己预编译它们并提交它们 无论哪种方式 我的 Rails 4 应用程序的 application
  • 解码和理解汇编代码

    所以有一点背景 我是 c 和汇编代码的初学者 我们有一个 炸弹 分配 用 c 编写 它调用需要某些密码的方法 但代码不可见 我需要通过查看汇编代码来确定正确的密码 该代码表明此方法的密码是 6 个数字 该密码作为 输入 传递到方法第 2 阶
  • Google 云端硬盘文件 ID 是全球唯一的吗?

    Google 云端硬盘文件 ID 在全球范围内是唯一的吗 UUID 是否有可能使用生成NSUUID类将与 Google 驱动器文件 ID 相同吗 仅供参考 这不是重复的 Google 文档 驱动器资源 ID 是否全局唯一 https sta
  • 如何从转义闭包中更改 inout 参数?

    我试图从转义闭包中修改函数的参数 如下所示 var completion gt Void func addCompletion closure escaping gt Void completion append closure func
  • jQuery 文件上传显示剩余时间?

    嗨我正在使用jQuery 文件上传 https github com blueimp jQuery File Upload wiki 它工作正常 我向用户显示一个进度条 显示上传进度 代码如下 fileupload fileupload p
  • 让 CMake 使用 gccfilter

    GCC过滤器 http www mixtion org gccfilter 是一个简洁的 Perl 脚本 允许对 GCC 的输出进行着色 从而使调试变得更加有趣 更重要的是 速度更快 您可以通过调用 GCCFilter 与 CMake 生成
  • OpenSSL::SSL::SSLError 仅限 Ubuntu 12.04

    我正在使用 Evernote Ruby API 开发 Web 应用程序 使用 Rails 和 oauth 但是在 Ubuntu 12 04 中运行该应用程序时 我收到错误 SSL connect SYSCALL returned 5 err
  • 使用 applescript 我想将文件夹中的每个文件移动到根文件夹

    我一直在尝试制作一个脚本将文件夹中的每个文件移动到根文件夹以包含每个子文件夹 我不想创建新文件夹 只需将其移动到根文件夹即可 我希望能够选择文件夹 然后仅在该特定文件夹上完成操作 原因是为了组织 我的确切情况是我有超过 TB 的电影 并且文
  • 可以在创建时将字典传递给 django 模型吗?

    是否可以用 a 做类似的事情list dictionary或者是其他东西 data dict title awesome title body great body of text Model objects create data dic
  • jQuery 处理表单

    这是一个非常简单的问题 我希望 但由于只是学习 掌握 jQuery 我提前道歉 如果我有一个表格 例如
  • google docs share 上使用了哪些技术

    我需要理解并知道我该如何做某事 在我的项目中 我需要创建类似于谷歌文档上的技术的东西 当我与其他人共享文档并且他和我同时编辑时 我会看到他的更改 我不知道这是否称为反向ajax或其他类型的技术 有人可以向我解释一下这是一种什么样的发展吗 E
  • Google Play 商店:您需要修复高分辨率图标。这不是有效的图像

    这是我尝试在 Play 商店中为我的应用程序提供图像时收到的错误消息 这是图像 它是在 GIMP 中创建的 请帮忙 这使我无法启动我的应用程序 如 Google Play 商店开发者控制台所述 图标图像应为 512 512 32 bitPN
  • Chrome 不缓存预检

    我正在实现一个应该支持跨域请求的 REST API 我想使用 CORS 来实现这一目标 我的几乎所有请求都是 不简单 的 这意味着对于所有非 GET 请求 浏览器必须发送预检请求 为了限制预检 选项请求的数量 我尝试让浏览器缓存选项请求 这
  • 如何识别 Rails 应用程序中的路线

    我有这个非常基本的问题 我正在用这个仪表板导轨发动机 https github com gottfrois dashing rails 这给了我一个views layouts dashing dashboard html erb 这是仪表板
  • Lombok Builder 注释引发 UnsupportedOperationException

    我在我的项目中使用 Lombok 我的模型看起来像 Builder Data AllArgsConstructor public class ScreenDefinitionDTO Singular private List
  • 如何获取可靠的 QGLWidget 快照

    在我的应用程序中 我拍摄 QGLWidget 内容的快照有两个目的 当只有覆盖层发生变化时 不要一直重绘场景 而是使用缓存的像素图 Lat 用户截取特定绘图的屏幕截图 3D 场景 我尝试的第一件事是grabFrameBuffer 对于第一个
  • 如何将 y 轴刻度标签设置在固定位置,以便当我向左或向右滚动时 y 轴刻度标签应该可见?

    在我的程序中 我首先绘制了图形 然后将图形导入到画布中 然后我将画布导入滚动区域 当我运行我的程序时 如果我向左滚动 yaxis 刻度标签会隐藏 或者我向右转动 yaxis 刻度标签也会隐藏 我已经采取了两个轴 轴 轴2 我已经设置了axe