- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 python+matplotlib+pyqt 编写了一个用于光谱分析的应用程序。应用程序中的绘图需要具有黑色背景、白色轴和符号。我保留了 matplotlib 的默认导航工具栏。由于反转颜色设置,我遇到的一个问题是缩放矩形的边缘是不可见的,因为它是黑色的。有没有一种简单的方法可以将缩放矩形的边缘颜色更改为明亮的颜色,例如白色。
提前谢谢您。
最佳答案
添加 Gloweye 的响应,在 PyQt5 中你应该这样做。
import six
import ctypes
import sys
from PyQt5 import QtCore, QtGui
from PyQt5.QtWidgets import QSizePolicy, QWidget, QVBoxLayout
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import (
FigureCanvasQTAgg as FigureCanvas,
NavigationToolbar2QT as NavigationToolbar)
QT_API = 'PyQt5'
DEBUG = False
_decref = ctypes.pythonapi.Py_DecRef
_decref.argtypes = [ctypes.py_object]
_decref.restype = None
class MplCanvas(FigureCanvas):
def __init__(self):
FigureCanvas.__init__(self,self.fig)
FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding,
QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
#Change de color of rectangle zoom toolbar rewriting painEvent
#the original code is in the backend_qt5agg.py file inside
#matplotlib/backends directory
def paintEvent(self, e):
"""
Copy the image from the Agg canvas to the qt.drawable.
In Qt, all drawing should be done inside of here when a widget is
shown onscreen.
"""
# if the canvas does not have a renderer, then give up and wait for
# FigureCanvasAgg.draw(self) to be called
if not hasattr(self, 'renderer'):
return
if DEBUG:
print('FigureCanvasQtAgg.paintEvent: ', self,
self.get_width_height())
if len(self.blitbox) == 0:
# matplotlib is in rgba byte order. QImage wants to put the bytes
# into argb format and is in a 4 byte unsigned int. Little endian
# system is LSB first and expects the bytes in reverse order
# (bgra).
if QtCore.QSysInfo.ByteOrder == QtCore.QSysInfo.LittleEndian:
stringBuffer = self.renderer._renderer.tostring_bgra()
else:
stringBuffer = self.renderer._renderer.tostring_argb()
refcnt = sys.getrefcount(stringBuffer)
# convert the Agg rendered image -> qImage
qImage = QtGui.QImage(stringBuffer, self.renderer.width,
self.renderer.height,
QtGui.QImage.Format_ARGB32)
if hasattr(qImage, 'setDevicePixelRatio'):
# Not available on Qt4 or some older Qt5.
qImage.setDevicePixelRatio(self._dpi_ratio)
# get the rectangle for the image
rect = qImage.rect()
p = QtGui.QPainter(self)
# reset the image area of the canvas to be the back-ground color
p.eraseRect(rect)
# draw the rendered image on to the canvas
p.drawPixmap(QtCore.QPoint(0, 0), QtGui.QPixmap.fromImage(qImage))
# draw the zoom rectangle to the QPainter
########################################################
# HERE CHANGE THE COLOR, IN THIS EXAMPLE #
# THE COLOR IS WHITE #
########################################################
if self._drawRect is not None:
pen = QtGui.QPen(QtCore.Qt.white, 1 / self._dpi_ratio,
QtCore.Qt.DotLine)
p.setPen(pen)
x, y, w, h = self._drawRect
p.drawRect(x, y, w, h)
p.end()
# This works around a bug in PySide 1.1.2 on Python 3.x,
# where the reference count of stringBuffer is incremented
# but never decremented by QImage.
# TODO: revert PR #1323 once the issue is fixed in PySide.
del qImage
if refcnt != sys.getrefcount(stringBuffer):
_decref(stringBuffer)
else:
p = QtGui.QPainter(self)
while len(self.blitbox):
bbox = self.blitbox.pop()
l, b, r, t = bbox.extents
w = int(r) - int(l)
h = int(t) - int(b)
t = int(b) + h
reg = self.copy_from_bbox(bbox)
stringBuffer = reg.to_string_argb()
qImage = QtGui.QImage(stringBuffer, w, h,
QtGui.QImage.Format_ARGB32)
if hasattr(qImage, 'setDevicePixelRatio'):
# Not available on Qt4 or some older Qt5.
qImage.setDevicePixelRatio(self._dpi_ratio)
# Adjust the stringBuffer reference count to work
# around a memory leak bug in QImage() under PySide on
# Python 3.x
if QT_API == 'PySide' and six.PY3:
ctypes.c_long.from_address(id(stringBuffer)).value = 1
origin = QtCore.QPoint(l, self.renderer.height - t)
pixmap = QtGui.QPixmap.fromImage(qImage)
p.drawPixmap(origin / self._dpi_ratio, pixmap)
# draw the zoom rectangle to the QPainter
if self._drawRect is not None:
pen = QtGui.QPen(QtCore.Qt.black, 1 / self._dpi_ratio,
QtCore.Qt.DotLine)
p.setPen(pen)
x, y, w, h = self._drawRect
p.drawRect(x, y, w, h)
p.end()
对于 MATPLOTLIB 2.2.2
from PyQt5.QtWidgets import QSizePolicy, QWidget, QVBoxLayout
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import (
FigureCanvasQTAgg as FigureCanvas,
NavigationToolbar2QT as NavigationToolbar)
class MplCanvas(FigureCanvas):
def __init__(self):
FigureCanvas.__init__(self, self.fig)
FigureCanvas.setSizePolicy(self,
QSizePolicy.Expanding,
QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
# HERE CHANGE THE COLOR OF ZOOM RECTANGLE
def drawRectangle(self, rect):
# Draw the zoom rectangle to the QPainter. _draw_rect_callback needs
# to be called at the end of paintEvent.
if rect is not None:
def _draw_rect_callback(painter):
# IN THIS EXAMPLE CHANGE BLACK FOR WHITE
pen = QtGui.QPen(QtCore.Qt.white, 1 / self._dpi_ratio,
QtCore.Qt.DotLine)
painter.setPen(pen)
painter.drawRect(*(pt / self._dpi_ratio for pt in rect))
else:
def _draw_rect_callback(painter):
return
self._draw_rect_callback = _draw_rect_callback
self.update()
class MplWidget (QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.canvas = MplCanvas()
# add the toolbar
self.ntb = NavigationToolbar(self.canvas, self)
self.vbl = QVBoxLayout()
self.vbl.addWidget(self.canvas)
self.vbl.addWidget(self.ntb)
self.setLayout(self.vbl)
关于python - 更改matplotlib中zoom-rect的边缘颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28599068/
我有一串数字。我需要检查边缘上的数字是否对称,这意味着它们以 2 为模时具有相同的余数。 我已经编写了一个有效的代码,但我对此感到不安,在一些失败之后我想出了这个代码: int PaliPair(ch
我要删除黑色蒙版和人体图像之间的白色边框 图像输入示例: 厚度为1的图像输出: 厚度为2的图像输出: 我尝试了一些在这里找到的具有模糊和阈值的游戏 我还使用此代码查找和绘制轮廓 thickne
这应该是一个在用户悬停时打开的飞出菜单。 这在 Chrome 中工作得很好,我已经尝试了多种方法(使用 CSS :hover,(mousenter)和(mouseleave ) 问题是 - 使用 Ed
我有一个 Apache 服务器 v2.4.43 为我的网站提供服务,我使用一个简单的 .htpasswd,我使用指令“AuthUserFile ”在 .htaccess 中调用它来进行身份验证。 现在
如何仅使用剪辑路径创建波浪边缘? 波浪应该是这样的图像: 最佳答案 您应该通过波函数及其频率生成此剪辑路径。 我用过 cos()在 PHP 中。您可以找到如下链接: https://repl.it/@
我有这张图: digraph G { 1 [label="car"]; 2 [label="x"]; 3 [label="car"]; 4 [label="y"]; 5 [label="cdr"];
我想强制点仅显示节点之间的垂直或水平边缘。 我在帖子 Family tree layout with Dot/GraphViz 中发现了类似的请求,但我不处理树,所以我希望有一个解决方案,无需插入额外
我已经设法让两个直方图重叠,但如果你仔细观察,条形开始倾斜并且没有完全重叠。 我已经调整了线宽和宽度,并没有改善。 我的目标是让所有的条形排列在彼此的顶部,黑边没有歪斜。 有什么办法解决这个问题 这是
我已经设法让两个直方图重叠,但如果你仔细观察,条形开始倾斜并且没有完全重叠。 我已经调整了线宽和宽度,并没有改善。 我的目标是让所有的条形排列在彼此的顶部,黑边没有歪斜。 有什么办法解决这个问题 这是
我一直在与 latex table 搏斗太久了。我需要一个具有居中标题的表格,以及包含可能环绕的文本的正文单元格。由于环绕要求,我使用 p{xxx} 而不是 l 来指定单元格宽度。这导致的问题是单元格
有没有办法平滑转换(平移和旋转)的 BufferedImage 的锯齿状边缘? 测试图像的放大 View : (请注意,这不是将要使用的实际 BufferedImage,仅用于此处演示)。 已使用双线
我在 my page 有一个旋转木马.我的父元素和子元素的边缘都是 flex 的,但是当您按“下一个”或“上一个”并滑动旋转木马时,子元素在移动时不会保持 flex 。我怎样才能避免这种情况? .ho
我在 .boxwrap 和 .lsmlbox + .rsmlbox 之间的嵌套 div 中添加了不必要的空格,这使得无法将 .smlbox + .rsmlbox 与 .box 对齐我相信这是一个比预期
我正在使用 Apple 的 ARKit 制作 AR 应用程序,我想制作盒子的线框轮廓。代码中描述并显示在图片中的那个在盒子的每个面上绘制斜边。它还隐藏了盒子另一侧的角。 Scene Kit 中有没有办
下图仅包含阈值处理后的黑色和白色像素。我在此图像的顶部绘制了一个灰色的旋转矩形。现在我想计算这个旋转矩形内的黑色像素数,但不包括白色矩形矩形外的黑色像素(即白色矩形内的像素数)。 做到这一点的最佳方法
你们如何处理边际 CSS?我所说的边缘是指需要斜体或粗体的单个单词或短语。只用 声明一个“大胆”的类似乎很愚蠢 Bold { font-weight: bold; } 或者斜体,要么! Italic
好的。我知道有几十个类似的线程。我几乎检查了每一个,但找不到可行的解决方案。我试过负边距、最小高度、最大高度、绝对页脚、正文背景颜色,甚至将溢出:隐藏到页面中的所有主要容器。然后将 clearfix
我网站的一部分使用代码使用倾斜边缘: -webkit-clip-path: 多边形(0% 0%, 100% 0%, 81% 100%, 0% 100%) 这在 Chrome 中运行良好,但不适用于任何
我一直在创建这个网站,并且进展顺利。然后我试着给它添加一个模态,但一切都有点走下坡路。问题是在添加模式后,Chrome 中的图像对齐方式发生了变化。它在 Edge 中运行良好。现在我知道这可能是因为
如果我在 Matlab 中使用 image() 命令制作一个 4 x 4 像素的图像,它会将刻度线居中放置在像素的中间。我希望刻度线以像素的左下角为中心。有什么方法可以做到这一点吗? 最佳答案 您可以
我是一名优秀的程序员,十分优秀!