Glumpy是一个用pythonOpenGL来进行快速Numpy可视化科学库
1 说明:
=====
1.1 Glumpy:是一个OpenGL+NumPy库,它用OpenGL来进行快速Numpy可视化。
1.2 即:Python+Numpy+OpenGL实现快速,可扩展和美观的科学可视化。
1.3 它是一个由Nicolas Rougier启动的开源项目,致力于高效可视化。
1.4 Glumpy使用OpenGL纹理(textures)来表示阵列,因为这恐怕是在现代图形硬件上最快的可视化方法了。
2 准备:
=====
2.1 官网:https://pypi.org/project/glumpy/ https://github.com/glumpy/glumpy https://glumpy.readthedocs.io/en/latest/ http://glumpy.github.io/
Glumpy:高效美观的科学可视化库
Glumpy - Python+Numpy+OpenGL: fast, scalable and beautiful scientific visualization
2.2 环境:
华为笔记本电脑、深度deepin-linux操作系统、谷歌浏览器、python3.8和微软vscode编辑器。
2.3 安装:pip install glumpy #本机安装 sudo pip3.8 install glumpy #本机推荐安装 sudo pip3.8 install -i https://mirrors.aliyun.com/pypi/simple glumpy
3 优美动画赏析:
===介绍入门和防止掉坑===
4 第一个窗口:
===========
4.1 注释版代码:from glumpy import app #本机安装过pyglet,而且glumpy默认是pyglet app.use("pyglet") #默认这个,但本机推荐这个 #注意没有上面的use的指定,会报错,也会自动默认pyglet打开 #比如下面的报错 #[w] Backend () not available #可以用的窗口模块 #backend : ["osxglut", "freeglut", "pyglet", "glfw", "sdl", "sdl2", "pyside"] Graphical toolkit to use #window = app.Window() #实例化窗口,大小设置,窗口名 #背景颜色color=(0,0,0,1)=黑色;color=(1,1,1,1)=白色;注意RGBA=RGB-A=RGB三基色+A透明度 window = app.Window(800,800,"The First win(第一个窗口)",color=(1,1,1,1)) #支持中文 #window = app.Window(width=800,height=800,title="The First win(第一个窗口)") #等同上面 #注意:如果没有这个窗口时间,那么上面的背景颜色设置就是默认黑色,一直没有反应 @window.event def on_draw(dt): window.clear() app.run() #duration=5==持续5秒后自动关闭窗口 #app.run(duration=5) #run的参数:framerate=帧率=60(秒) #clock=None, framerate=None, interactive=None, duration=sys.maxsize, framecount=sys.maxsize
4.2 上面简洁版代码:from glumpy import app app.use("pyglet") #默认这个,但本机推荐这个 window = app.Window(800,800,"The First win(第一个窗口)",color=(1,1,1,1)) #支持中文 @window.event def on_draw(dt): window.clear() app.run()
4.3 图:
5 你好世界:Helloworld:
==================
5.1 代码:from glumpy import app from glumpy.graphics.text import FontManager from glumpy.graphics.collections import GlyphCollection from glumpy.transforms import Position, OrthographicProjection #窗口大小和标题名设置 window = app.Window(1000, 1000,"你好世界") #window = app.Window(width=1000, height=1000,title="你好世界") #等同于上面的 #app.use("glfw") app.use("pyglet") #本机采用这个 @window.event def on_draw(dt): window.clear() label.draw() x,y,z = 0,500,0 #自定义中文字体:路径和字体名,字体大小设置 font = FontManager.get("/home/xgj/Desktop/glumpy/hwfs.ttf", 20, mode="agg") label = GlyphCollection("agg", transform=OrthographicProjection(Position())) #color=(1,1,1,1)为白色 #anchor_x = "center", anchor_y = "center" label.append("Hello World 你好世界!", font,anchor_x = "left", anchor_y = "center",origin=(x,y,z), color=(0.6,0.4,0.2,1)) window.attach(label["transform"]) app.run()
5.2 图:
6 多彩爱心:
========
6.1 代码:import numpy as np from glumpy import app from glumpy.graphics.collections import MarkerCollection app.use("pyglet") #窗口大小,窗口名,背景颜色白色 window = app.Window(1024,1024, "多彩爱心满屏",color=(1,1,1,1)) @window.event def on_draw(dt): window.clear() markers.draw() markers["orientation"] += np.random.uniform(0.0,0.1,len(markers)) del markers[0] #逐个删除列表的0位爱心,逐个减少 if not len(markers): #最后没有退出 app.quit() n = 556 markers = MarkerCollection(orientation="local") markers.append(np.random.uniform(-1,1,(n,3)), bg_color = np.random.uniform(0,1,(n,4)), size = 64, fg_color=(0,0,0,1)) window.attach(markers["transform"]) window.attach(markers["viewport"]) app.run()
6.2 效果图:
7 colorful Scatter:
============
7.1 代码:import numpy as np from glumpy import app from glumpy.graphics.collections import PointCollection app.use("pyglet") #背景颜色color=(1,1,1,1)为白色 window = app.Window(1024,1024,"多彩散点图", color=(.2,.2,.2,1)) points = PointCollection("agg", color="local", size="local") @window.event def on_draw(dt): window.clear() points.draw() if len(points) < 100000: points.append(np.random.normal(0.0,0.5,(1,3)), color = np.random.uniform(0,1,4), size = np.random.uniform(1,24,1)) window.attach(points["transform"]) window.attach(points["viewport"]) app.run()
7.2 效果图:
8 green wave:
==========
8.1 代码:#oscilloscope==green wave import numpy as np from glumpy import app, gl, glm, gloo vertex = """ attribute float x, y, intensity; varying float v_intensity; void main (void) { v_intensity = intensity; gl_Position = vec4(x, y, 0.0, 1.0); } """ fragment = """ varying float v_intensity; void main() { gl_FragColor = vec4(0,v_intensity,0,1); } """ app.use("pyglet") #默认这个,但本机推荐这个 window = app.Window(width=1024, height=512,title="greenwave") @window.event def on_draw(dt): global index window.clear() oscilloscope.draw(gl.GL_LINE_STRIP) index = (index-1) % len(oscilloscope) oscilloscope["intensity"] -= 1.0/len(oscilloscope) oscilloscope["y"][index] = np.random.uniform(-0.25, +0.25) oscilloscope["intensity"][index] = 1.0 index = 0 oscilloscope = gloo.Program(vertex, fragment, count=150) oscilloscope["x"] = np.linspace(-1,1,len(oscilloscope)) app.run()
8.2 图:
9 matplotlib的API:
=============
9.1 代码:import numpy as np from glumpy.api.matplotlib import * #推荐增加这2行 #from glumpy import app #app.use("pyglet") #默认这个,但本机推荐这个 # Create a new figure figure = Figure((24,12)) # Create a subplot on left, using trackball interface (3d) left = figure.add_axes( [0.010, 0.01, 0.485, 0.98], xscale = LinearScale(clamp=True), yscale = LinearScale(clamp=True), zscale = LinearScale(clamp=True), interface = Trackball(name="trackball"), facecolor=(1,0,0,0.25), aspect=1 ) # Create a subplot on right, using panzoom interface (2d) right = figure.add_axes( [0.505, 0.01, 0.485, 0.98], xscale = LinearScale(domain=[-2.0,+2.0], range=[0.25,1.00]), yscale = LinearScale(domain=[-2.0,+2.0], range=[0,2*np.pi]), projection = PolarProjection(), interface = Trackball(name="trackball"), facecolor=(0,0,1,0.25), aspect=1 ) # Create a new collection of points collection = PointCollection("agg") # Add a view of the collection on the left subplot left.add_drawable(collection) # Add a view of the collection on the right subplot right.add_drawable(collection) # Add some points collection.append(np.random.uniform(-2,2,(10000,3))) # Show figure figure.show()
9.2 图:
10 简化qt5:
==========
10.1 代码:import numpy as np from glumpy import app from PyQt5.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QPushButton app.use("qt5") window = app.Window() #window = app.Window(width=1000, height=1000,title="qt5") #设置窗口大小和名称无效 qwindow = QMainWindow() #源代码中无下面2行,自己增加的,这样设置主窗口位置和大小、标题名 qwindow.setGeometry(0,0,800,800) #自己增加 qwindow.setWindowTitle("Glumpy qt5") #自己增加 widget = QWidget() button = QPushButton("Press me!") qwindow.setCentralWidget(widget) widget.setLayout(QVBoxLayout()) widget.layout().addWidget(window._native_window) widget.layout().addWidget(button) @window.event def on_draw(dt): window.clear() @button.clicked.connect def on_click(): window.color = np.random.rand(4) qwindow.show() app.run()
10.2 图:
10.3 我无法解决的一个小bug=报错,希望大神指点,谢谢!!
===自己整理并分享出来===
喜欢的人,请点赞、关注、评论、转发和收藏。