如何使用matplotlib或pyqtgraph绘制如下图:

线AB是双向街道,绿色部分表示从A点到B点的方向,红色部分表示B到A,每个部分的宽度表示交通量.宽度以磅为单位测量,不会在不同的缩放级别或dpi设置下更改.
这只是一个例子,事实上我有很多街道.这种情节在许多交通软件中很常见.我尝试使用matplotlib的patheffect,但结果令人沮丧:
from matplotlib import pyplot as plt
import matplotlib.patheffects as path_effects
x=[0,1,2,3]
y=[1,0,0,-1]
ab_width=20
ba_width=30
fig, axes= plt.subplots(1,1)
center_line, = axes.plot(x,y,color='k',linewidth=2)
center_line.set_path_effects(
[path_effects.SimpleLineShadow(offset=(0, -ab_width/2),shadow_color='g', alpha=1, linewidth=ab_width),
path_effects.SimpleLineShadow(offset=(0, ba_width/2), shadow_color='r', alpha=1, linewidth=ba_width),
path_effects.SimpleLineShadow(offset=(0, -ab_width), shadow_color='k', alpha=1, linewidth=2),
path_effects.SimpleLineShadow(offset=(0, ba_width), shadow_color='k', alpha=1, linewidth=2),
path_effects.Normal()])
axes.set_xlim(-1,4)
axes.set_ylim(-1.5,1.5)
Run Code Online (Sandbox Code Playgroud)
我想到的一个想法是将线的每个部分作为独立线,并在更改缩放级别时重新计算它的位置,但它太复杂和缓慢.
如果有任何简单的方法使用matplotlib或pyqtgraph绘制我想要的东西?任何建议将不胜感激!
我正在使用pyqtgraph,它使用鼠标滚轮具有开箱即用的缩放行为。然而,对于我的应用程序,我只需要放大 x 或 y 方向。
我希望做到以下几点:
在 pyqtgraph 中解决这个问题的最佳方法是什么?
所以 Pyqtgraph 会自动计算轴并在缩放时重新缩放,这很好。然而我有两个轴,频率和小时。频率可以采用 0-100 之间的任何值,小时可以采用 0-39 之间的任何值。如何将轴限制为这些上限/下限,以便当用户缩放或平移时它们不能超出这些值?
我的代码如下(3行,我的实际代码会绘制更多):
from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
pg.setConfigOption('background', 'w')
pg.setConfigOption('foreground', 'k')
from random import randint
class CustomViewBox(pg.ViewBox):
def __init__(self, *args, **kwds):
pg.ViewBox.__init__(self, *args, **kwds)
self.setMouseMode(self.RectMode)
## reimplement right-click to zoom out
def mouseClickEvent(self, ev):
if ev.button() == QtCore.Qt.RightButton:
#self.autoRange()
self.setXRange(0,5)
self.setYRange(0,10)
def mouseDragEvent(self, ev):
if ev.button() == QtCore.Qt.RightButton:
ev.ignore()
else:
pg.ViewBox.mouseDragEvent(self, ev)
app = pg.mkQApp()
vb = CustomViewBox()
graph = pg.PlotWidget(viewBox=vb, enableMenu=False)
colour = []
for …Run Code Online (Sandbox Code Playgroud) 我需要在 PyQtGraph 中绘制一个大的时间序列(数百万个点)。按原样绘制它实际上是不可能的,并且当打开优化选项(使用下采样setDownsampling和使用裁剪setClipToView)时,缩小时它仍然几乎不可用(只有在放大时,由于裁剪,它才会变得很快)。
不过我有一个想法。我可以对数据进行预下采样,因为它们是静态的。然后,我可以在缩小时使用缓存的下采样数据,在放大时使用原始数据。
我怎样才能做到这一点?
在 python 中使用 pyqtgraph 模块时遇到问题。当我将白色背景颜色添加到 glscatterplot 时,散点就会消失。就像如果背景颜色被添加到散点图的颜色中,那么一切都是白色的。这是我使用的一段代码:
w = gl.GLViewWidget()
w.setBackgroundColor('w')
w.show()
sp3 = gl.GLScatterPlotItem(pos=np.transpose(pos3), color=rgba_img, size=1, pxMode=False)
w.addItem(sp3)
Run Code Online (Sandbox Code Playgroud)
如果我在 setBackgroundColor 方法中将 ('w') 替换为 ('k'),则分散的颜色很好,背景为黑色。有没有其他人遇到过这个问题?
我已经用 pyqtgraph 绘制了一个 3D 图,我想保存/导出它。在 3D 绘图上单击鼠标右键不会打开任何允许我保存绘图的上下文菜单。http://www.pyqtgraph.org/documentation/exporting.html 上的文档告诉我如何从程序中保存/导出,但按照 3D 结果的说明保存黑色图像。
这是我的代码的相关部分:
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
import pyqtgraph.opengl as gl
import numpy as np
import pyqtgraph.exporters
app = QtGui.QApplication([])
w = gl.GLViewWidget()
w.show()
w.setCameraPosition(distance=50)
g = gl.GLGridItem()
g.scale(2,2,1)
g.setDepthValue(10)
w.addItem(g)
z=np.genfromtxt('../mydata.txt')
p1 = gl.GLSurfacePlotItem(z=z, shader='shaded', color=(0.5, 0.5, 1, 1))
p1.scale(0.1, 0.1, 0.1)
p1.translate(-0, 0, 0)
w.addItem(p1)
w.grabFrameBuffer().save('test.png')
if __name__ == '__main__':
import sys
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()
Run Code Online (Sandbox Code Playgroud)
mydata.txt 包含浮点值的二维数组。该图正确显示在我的屏幕上。有没有人成功地从 …
这是我的代码。
from pyqtgraph.Qt import QtGui
import numpy as np
import pyqtgraph.opengl as gl
from netCDF4 import Dataset
import sys
def main():
app = QtGui.QApplication(sys.argv)
w=gl.GLViewWidget()
w.show()
w.setCameraPosition(distance=150)
#just my data
data=Dataset('200707.nc')
prec=data.variables['Prec'][5,:59,:59]
p = gl.GLSurfacePlotItem(z=prec[:] ,shader='heightColor')
p.shader()['colorMap'] = np.array([0.2, 2, 0.5, 0.2, 1, 1, 0.2, 0, 2])
w.addItem(p)
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
我认为问题可能出在库与我的 Mac 像素布局的交互中。真的不确定它可能是什么或如何解决它。我应该考虑使用不同的程序吗?
如何构建代码以在进程中连续多次运行 pyqt GUI?
(特别是pyqtgraph,如果相关的话)
在测量设备上执行长时间运行数据捕获的 python 脚本(一个大循环)。在每次捕获迭代期间,都会出现一个新的 GUI,并向用户显示来自测量设备的实时数据,同时主捕获代码正在运行。
我想做这样的事情:
for setting in settings:
measurement_equipment.start(setting)
gui = LiveDataStreamGUI(measurement_equipment)
gui.display()
measurement_equipment.capture_data(300) #may take hours
gui.close()
Run Code Online (Sandbox Code Playgroud)
我希望数据捕获代码成为主线程。然而 pyqt 似乎不允许这种架构,因为它app.exec_()是一个阻塞调用,允许每个进程只创建一次 GUI(例如,在gui.display()上面)。
我想在 pyqtgraph.PlotWidget() 中显示多通道数据。但是,当设置 AxisItem() 的 yRange 时,刻度会自动更改。像这样:
import pyqtgraph as pg
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('PyqtLib')
self.setFixedSize(1000, 800)
pg.setConfigOption('background', 'w')
pg.setConfigOption('foreground', 'k')
layout = QHBoxLayout(self)
self.graph_show = pg.PlotWidget()
layout.addWidget(self.graph_show)
self.graph_show.setRange(yRange = (0, 5), xRange = (0, 10), disableAutoRange=True)
self.graph_show.invertY()
for i in range(1, 10):
self.graph_show.addLine(x=i, pen='k')
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
但是当给出 yRange=(0, 5) 时,刻度会自动设置为 [0, 1, 2, …
我正在使用 PyQt5 和 pyqtgraph 来绘制实时传感器数据。该图是更大的 PyQt5 应用程序的一部分,该应用程序用于与各种硬件交互并可视化传感器数据。
背景:下面的代码是一个非常简化的代码示例,负责查询传感器的数据,然后绘制瞬时位置及其移动平均值的图表。每 x 毫秒间隔在一个单独的线程中查询传感器。
问题: 图形和传感器读数按预期工作。然而,运行应用程序几秒钟后,pyqtgraph 停止更新并冻结。一旦图形冻结,我看到图形刷新/更新的唯一时间是当我尝试调整窗口大小或将焦点置于另一个窗口并重新聚焦回图形窗口时。在这种情况下,图表将仅更新一次并且不会继续刷新。
我在下面的链接中读到其他用户也有类似的问题。然而,建议的解决方案不是从单独的线程更新 GUI。就我而言,我不会从单独的线程更新图表。我仅使用单独的线程来收集传感器数据,然后发出带有新数据的信号。图的更新发生在主线程中。
import time
import numpy as np
from threading import Thread
import pyqtgraph as pg
import bottleneck as bn
import PyQt5
class MySensor():
def get_position(self, mean=0.0, standard_dev=0.1):
# Random sensor data
return np.random.normal(mean,standard_dev,1)[0]
class SignalCommunicate(PyQt5.QtCore.QObject):
# https://stackoverflow.com/a/45620056
got_new_sensor_data = PyQt5.QtCore.pyqtSignal(float, float)
position_updated = PyQt5.QtCore.pyqtSignal(float)
class LiveSensorViewer():
def __init__(self, sensor_update_interval=25):
# super().__init__()
# How frequently to get sensor data and update graph …Run Code Online (Sandbox Code Playgroud)