vispy 0.15.0__cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of vispy might be problematic. Click here for more details.
- vispy/__init__.py +33 -0
- vispy/app/__init__.py +15 -0
- vispy/app/_default_app.py +76 -0
- vispy/app/_detect_eventloop.py +148 -0
- vispy/app/application.py +263 -0
- vispy/app/backends/__init__.py +52 -0
- vispy/app/backends/_egl.py +264 -0
- vispy/app/backends/_glfw.py +513 -0
- vispy/app/backends/_jupyter_rfb.py +278 -0
- vispy/app/backends/_offscreen_util.py +121 -0
- vispy/app/backends/_osmesa.py +235 -0
- vispy/app/backends/_pyglet.py +451 -0
- vispy/app/backends/_pyqt4.py +36 -0
- vispy/app/backends/_pyqt5.py +36 -0
- vispy/app/backends/_pyqt6.py +40 -0
- vispy/app/backends/_pyside.py +37 -0
- vispy/app/backends/_pyside2.py +52 -0
- vispy/app/backends/_pyside6.py +53 -0
- vispy/app/backends/_qt.py +1003 -0
- vispy/app/backends/_sdl2.py +444 -0
- vispy/app/backends/_template.py +244 -0
- vispy/app/backends/_test.py +8 -0
- vispy/app/backends/_tk.py +800 -0
- vispy/app/backends/_wx.py +476 -0
- vispy/app/backends/tests/__init__.py +0 -0
- vispy/app/backends/tests/test_offscreen_util.py +52 -0
- vispy/app/backends/tests/test_rfb.py +77 -0
- vispy/app/base.py +294 -0
- vispy/app/canvas.py +828 -0
- vispy/app/qt.py +92 -0
- vispy/app/tests/__init__.py +0 -0
- vispy/app/tests/qt-designer.ui +58 -0
- vispy/app/tests/test_app.py +442 -0
- vispy/app/tests/test_backends.py +164 -0
- vispy/app/tests/test_canvas.py +122 -0
- vispy/app/tests/test_context.py +92 -0
- vispy/app/tests/test_qt.py +47 -0
- vispy/app/tests/test_simultaneous.py +134 -0
- vispy/app/timer.py +174 -0
- vispy/color/__init__.py +17 -0
- vispy/color/_color_dict.py +193 -0
- vispy/color/color_array.py +447 -0
- vispy/color/color_space.py +181 -0
- vispy/color/colormap.py +1213 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +378 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1522 -0
- vispy/ext/cubehelix.py +138 -0
- vispy/ext/egl.py +375 -0
- vispy/ext/fontconfig.py +118 -0
- vispy/ext/gdi32plus.py +206 -0
- vispy/ext/osmesa.py +105 -0
- vispy/geometry/__init__.py +23 -0
- vispy/geometry/_triangulation_debugger.py +171 -0
- vispy/geometry/calculations.py +162 -0
- vispy/geometry/curves.py +399 -0
- vispy/geometry/generation.py +643 -0
- vispy/geometry/isocurve.py +175 -0
- vispy/geometry/isosurface.py +465 -0
- vispy/geometry/meshdata.py +700 -0
- vispy/geometry/normals.py +78 -0
- vispy/geometry/parametric.py +56 -0
- vispy/geometry/polygon.py +137 -0
- vispy/geometry/rect.py +210 -0
- vispy/geometry/tests/__init__.py +0 -0
- vispy/geometry/tests/test_calculations.py +23 -0
- vispy/geometry/tests/test_generation.py +56 -0
- vispy/geometry/tests/test_meshdata.py +106 -0
- vispy/geometry/tests/test_triangulation.py +594 -0
- vispy/geometry/torusknot.py +142 -0
- vispy/geometry/triangulation.py +876 -0
- vispy/gloo/__init__.py +56 -0
- vispy/gloo/buffer.py +505 -0
- vispy/gloo/context.py +272 -0
- vispy/gloo/framebuffer.py +257 -0
- vispy/gloo/gl/__init__.py +234 -0
- vispy/gloo/gl/_constants.py +332 -0
- vispy/gloo/gl/_es2.py +986 -0
- vispy/gloo/gl/_gl2.py +1365 -0
- vispy/gloo/gl/_proxy.py +499 -0
- vispy/gloo/gl/_pyopengl2.py +362 -0
- vispy/gloo/gl/dummy.py +24 -0
- vispy/gloo/gl/es2.py +62 -0
- vispy/gloo/gl/gl2.py +98 -0
- vispy/gloo/gl/glplus.py +168 -0
- vispy/gloo/gl/pyopengl2.py +97 -0
- vispy/gloo/gl/tests/__init__.py +0 -0
- vispy/gloo/gl/tests/test_basics.py +282 -0
- vispy/gloo/gl/tests/test_functionality.py +568 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1824 -0
- vispy/gloo/globject.py +101 -0
- vispy/gloo/preprocessor.py +67 -0
- vispy/gloo/program.py +543 -0
- vispy/gloo/tests/__init__.py +0 -0
- vispy/gloo/tests/test_buffer.py +558 -0
- vispy/gloo/tests/test_context.py +119 -0
- vispy/gloo/tests/test_framebuffer.py +195 -0
- vispy/gloo/tests/test_glir.py +307 -0
- vispy/gloo/tests/test_globject.py +35 -0
- vispy/gloo/tests/test_program.py +302 -0
- vispy/gloo/tests/test_texture.py +732 -0
- vispy/gloo/tests/test_use_gloo.py +187 -0
- vispy/gloo/tests/test_util.py +60 -0
- vispy/gloo/tests/test_wrappers.py +261 -0
- vispy/gloo/texture.py +1046 -0
- vispy/gloo/util.py +129 -0
- vispy/gloo/wrappers.py +762 -0
- vispy/glsl/__init__.py +42 -0
- vispy/glsl/antialias/antialias.glsl +7 -0
- vispy/glsl/antialias/cap-butt.glsl +31 -0
- vispy/glsl/antialias/cap-round.glsl +29 -0
- vispy/glsl/antialias/cap-square.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
- vispy/glsl/antialias/cap.glsl +67 -0
- vispy/glsl/antialias/caps.glsl +67 -0
- vispy/glsl/antialias/filled.glsl +50 -0
- vispy/glsl/antialias/outline.glsl +40 -0
- vispy/glsl/antialias/stroke.glsl +43 -0
- vispy/glsl/arrowheads/angle.glsl +99 -0
- vispy/glsl/arrowheads/arrowheads.frag +60 -0
- vispy/glsl/arrowheads/arrowheads.glsl +12 -0
- vispy/glsl/arrowheads/arrowheads.vert +83 -0
- vispy/glsl/arrowheads/curved.glsl +48 -0
- vispy/glsl/arrowheads/inhibitor.glsl +26 -0
- vispy/glsl/arrowheads/stealth.glsl +46 -0
- vispy/glsl/arrowheads/triangle.glsl +97 -0
- vispy/glsl/arrowheads/util.glsl +13 -0
- vispy/glsl/arrows/angle-30.glsl +12 -0
- vispy/glsl/arrows/angle-60.glsl +12 -0
- vispy/glsl/arrows/angle-90.glsl +12 -0
- vispy/glsl/arrows/arrow.frag +39 -0
- vispy/glsl/arrows/arrow.vert +49 -0
- vispy/glsl/arrows/arrows.glsl +17 -0
- vispy/glsl/arrows/common.glsl +187 -0
- vispy/glsl/arrows/curved.glsl +63 -0
- vispy/glsl/arrows/stealth.glsl +50 -0
- vispy/glsl/arrows/triangle-30.glsl +12 -0
- vispy/glsl/arrows/triangle-60.glsl +12 -0
- vispy/glsl/arrows/triangle-90.glsl +12 -0
- vispy/glsl/arrows/util.glsl +98 -0
- vispy/glsl/build_spatial_filters.py +660 -0
- vispy/glsl/collections/agg-fast-path.frag +20 -0
- vispy/glsl/collections/agg-fast-path.vert +78 -0
- vispy/glsl/collections/agg-glyph.frag +60 -0
- vispy/glsl/collections/agg-glyph.vert +33 -0
- vispy/glsl/collections/agg-marker.frag +35 -0
- vispy/glsl/collections/agg-marker.vert +48 -0
- vispy/glsl/collections/agg-path.frag +55 -0
- vispy/glsl/collections/agg-path.vert +166 -0
- vispy/glsl/collections/agg-point.frag +21 -0
- vispy/glsl/collections/agg-point.vert +35 -0
- vispy/glsl/collections/agg-segment.frag +32 -0
- vispy/glsl/collections/agg-segment.vert +75 -0
- vispy/glsl/collections/marker.frag +38 -0
- vispy/glsl/collections/marker.vert +48 -0
- vispy/glsl/collections/raw-path.frag +15 -0
- vispy/glsl/collections/raw-path.vert +24 -0
- vispy/glsl/collections/raw-point.frag +14 -0
- vispy/glsl/collections/raw-point.vert +31 -0
- vispy/glsl/collections/raw-segment.frag +18 -0
- vispy/glsl/collections/raw-segment.vert +26 -0
- vispy/glsl/collections/raw-triangle.frag +13 -0
- vispy/glsl/collections/raw-triangle.vert +26 -0
- vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
- vispy/glsl/collections/sdf-glyph.frag +80 -0
- vispy/glsl/collections/sdf-glyph.vert +59 -0
- vispy/glsl/collections/tick-labels.vert +71 -0
- vispy/glsl/colormaps/autumn.glsl +20 -0
- vispy/glsl/colormaps/blues.glsl +20 -0
- vispy/glsl/colormaps/color-space.glsl +17 -0
- vispy/glsl/colormaps/colormaps.glsl +24 -0
- vispy/glsl/colormaps/cool.glsl +20 -0
- vispy/glsl/colormaps/fire.glsl +21 -0
- vispy/glsl/colormaps/gray.glsl +20 -0
- vispy/glsl/colormaps/greens.glsl +20 -0
- vispy/glsl/colormaps/hot.glsl +22 -0
- vispy/glsl/colormaps/ice.glsl +20 -0
- vispy/glsl/colormaps/icefire.glsl +23 -0
- vispy/glsl/colormaps/parse.py +40 -0
- vispy/glsl/colormaps/reds.glsl +20 -0
- vispy/glsl/colormaps/spring.glsl +20 -0
- vispy/glsl/colormaps/summer.glsl +20 -0
- vispy/glsl/colormaps/user.glsl +22 -0
- vispy/glsl/colormaps/util.glsl +41 -0
- vispy/glsl/colormaps/wheel.glsl +21 -0
- vispy/glsl/colormaps/winter.glsl +20 -0
- vispy/glsl/lines/agg.frag +320 -0
- vispy/glsl/lines/agg.vert +241 -0
- vispy/glsl/markers/arrow.glsl +12 -0
- vispy/glsl/markers/asterisk.glsl +16 -0
- vispy/glsl/markers/chevron.glsl +14 -0
- vispy/glsl/markers/clover.glsl +20 -0
- vispy/glsl/markers/club.glsl +31 -0
- vispy/glsl/markers/cross.glsl +17 -0
- vispy/glsl/markers/diamond.glsl +12 -0
- vispy/glsl/markers/disc.glsl +9 -0
- vispy/glsl/markers/ellipse.glsl +67 -0
- vispy/glsl/markers/hbar.glsl +9 -0
- vispy/glsl/markers/heart.glsl +15 -0
- vispy/glsl/markers/infinity.glsl +15 -0
- vispy/glsl/markers/marker-sdf.frag +74 -0
- vispy/glsl/markers/marker-sdf.vert +41 -0
- vispy/glsl/markers/marker.frag +36 -0
- vispy/glsl/markers/marker.vert +46 -0
- vispy/glsl/markers/markers.glsl +24 -0
- vispy/glsl/markers/pin.glsl +18 -0
- vispy/glsl/markers/ring.glsl +11 -0
- vispy/glsl/markers/spade.glsl +28 -0
- vispy/glsl/markers/square.glsl +10 -0
- vispy/glsl/markers/tag.glsl +11 -0
- vispy/glsl/markers/triangle.glsl +14 -0
- vispy/glsl/markers/vbar.glsl +9 -0
- vispy/glsl/math/circle-through-2-points.glsl +30 -0
- vispy/glsl/math/constants.glsl +48 -0
- vispy/glsl/math/double.glsl +114 -0
- vispy/glsl/math/functions.glsl +20 -0
- vispy/glsl/math/point-to-line-distance.glsl +31 -0
- vispy/glsl/math/point-to-line-projection.glsl +29 -0
- vispy/glsl/math/signed-line-distance.glsl +27 -0
- vispy/glsl/math/signed-segment-distance.glsl +30 -0
- vispy/glsl/misc/regular-grid.frag +244 -0
- vispy/glsl/misc/spatial-filters.frag +1407 -0
- vispy/glsl/misc/viewport-NDC.glsl +20 -0
- vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
- vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
- vispy/glsl/transforms/hammer.glsl +44 -0
- vispy/glsl/transforms/identity.glsl +6 -0
- vispy/glsl/transforms/identity_forward.glsl +23 -0
- vispy/glsl/transforms/identity_inverse.glsl +23 -0
- vispy/glsl/transforms/linear-scale.glsl +127 -0
- vispy/glsl/transforms/log-scale.glsl +126 -0
- vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
- vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
- vispy/glsl/transforms/panzoom.glsl +10 -0
- vispy/glsl/transforms/polar.glsl +41 -0
- vispy/glsl/transforms/position.glsl +44 -0
- vispy/glsl/transforms/power-scale.glsl +139 -0
- vispy/glsl/transforms/projection.glsl +7 -0
- vispy/glsl/transforms/pvm.glsl +13 -0
- vispy/glsl/transforms/rotate.glsl +45 -0
- vispy/glsl/transforms/trackball.glsl +15 -0
- vispy/glsl/transforms/translate.glsl +35 -0
- vispy/glsl/transforms/transverse_mercator.glsl +38 -0
- vispy/glsl/transforms/viewport-clipping.glsl +14 -0
- vispy/glsl/transforms/viewport-transform.glsl +16 -0
- vispy/glsl/transforms/viewport.glsl +50 -0
- vispy/glsl/transforms/x.glsl +24 -0
- vispy/glsl/transforms/y.glsl +19 -0
- vispy/glsl/transforms/z.glsl +14 -0
- vispy/io/__init__.py +20 -0
- vispy/io/_data/spatial-filters.npy +0 -0
- vispy/io/datasets.py +94 -0
- vispy/io/image.py +231 -0
- vispy/io/mesh.py +122 -0
- vispy/io/stl.py +167 -0
- vispy/io/tests/__init__.py +0 -0
- vispy/io/tests/test_image.py +47 -0
- vispy/io/tests/test_io.py +121 -0
- vispy/io/wavefront.py +350 -0
- vispy/plot/__init__.py +36 -0
- vispy/plot/fig.py +58 -0
- vispy/plot/plotwidget.py +522 -0
- vispy/plot/tests/__init__.py +0 -0
- vispy/plot/tests/test_plot.py +46 -0
- vispy/scene/__init__.py +43 -0
- vispy/scene/cameras/__init__.py +27 -0
- vispy/scene/cameras/_base.py +38 -0
- vispy/scene/cameras/arcball.py +105 -0
- vispy/scene/cameras/base_camera.py +551 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +311 -0
- vispy/scene/cameras/perspective.py +338 -0
- vispy/scene/cameras/tests/__init__.py +0 -0
- vispy/scene/cameras/tests/test_cameras.py +27 -0
- vispy/scene/cameras/tests/test_link.py +53 -0
- vispy/scene/cameras/tests/test_perspective.py +122 -0
- vispy/scene/cameras/turntable.py +183 -0
- vispy/scene/canvas.py +639 -0
- vispy/scene/events.py +85 -0
- vispy/scene/node.py +644 -0
- vispy/scene/subscene.py +20 -0
- vispy/scene/tests/__init__.py +0 -0
- vispy/scene/tests/test_canvas.py +119 -0
- vispy/scene/tests/test_node.py +142 -0
- vispy/scene/tests/test_visuals.py +141 -0
- vispy/scene/visuals.py +276 -0
- vispy/scene/widgets/__init__.py +18 -0
- vispy/scene/widgets/anchor.py +25 -0
- vispy/scene/widgets/axis.py +88 -0
- vispy/scene/widgets/colorbar.py +176 -0
- vispy/scene/widgets/console.py +351 -0
- vispy/scene/widgets/grid.py +509 -0
- vispy/scene/widgets/label.py +50 -0
- vispy/scene/widgets/tests/__init__.py +0 -0
- vispy/scene/widgets/tests/test_colorbar.py +47 -0
- vispy/scene/widgets/viewbox.py +199 -0
- vispy/scene/widgets/widget.py +478 -0
- vispy/testing/__init__.py +51 -0
- vispy/testing/_runners.py +448 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +494 -0
- vispy/testing/rendered_array_tester.py +85 -0
- vispy/testing/tests/__init__.py +0 -0
- vispy/testing/tests/test_testing.py +20 -0
- vispy/util/__init__.py +32 -0
- vispy/util/bunch.py +15 -0
- vispy/util/check_environment.py +57 -0
- vispy/util/config.py +490 -0
- vispy/util/dpi/__init__.py +19 -0
- vispy/util/dpi/_linux.py +69 -0
- vispy/util/dpi/_quartz.py +26 -0
- vispy/util/dpi/_win32.py +34 -0
- vispy/util/dpi/tests/__init__.py +0 -0
- vispy/util/dpi/tests/test_dpi.py +16 -0
- vispy/util/eq.py +41 -0
- vispy/util/event.py +774 -0
- vispy/util/fetching.py +276 -0
- vispy/util/filter.py +44 -0
- vispy/util/fonts/__init__.py +14 -0
- vispy/util/fonts/_freetype.py +73 -0
- vispy/util/fonts/_quartz.py +192 -0
- vispy/util/fonts/_triage.py +36 -0
- vispy/util/fonts/_vispy_fonts.py +20 -0
- vispy/util/fonts/_win32.py +105 -0
- vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
- vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
- vispy/util/fonts/tests/__init__.py +0 -0
- vispy/util/fonts/tests/test_font.py +45 -0
- vispy/util/fourier.py +69 -0
- vispy/util/frozen.py +25 -0
- vispy/util/gallery_scraper.py +268 -0
- vispy/util/keys.py +91 -0
- vispy/util/logs.py +358 -0
- vispy/util/osmesa_gl.py +17 -0
- vispy/util/profiler.py +135 -0
- vispy/util/ptime.py +16 -0
- vispy/util/quaternion.py +229 -0
- vispy/util/svg/__init__.py +18 -0
- vispy/util/svg/base.py +20 -0
- vispy/util/svg/color.py +219 -0
- vispy/util/svg/element.py +51 -0
- vispy/util/svg/geometry.py +478 -0
- vispy/util/svg/group.py +66 -0
- vispy/util/svg/length.py +81 -0
- vispy/util/svg/number.py +25 -0
- vispy/util/svg/path.py +332 -0
- vispy/util/svg/shapes.py +57 -0
- vispy/util/svg/style.py +59 -0
- vispy/util/svg/svg.py +40 -0
- vispy/util/svg/transform.py +223 -0
- vispy/util/svg/transformable.py +28 -0
- vispy/util/svg/viewport.py +73 -0
- vispy/util/tests/__init__.py +0 -0
- vispy/util/tests/test_config.py +58 -0
- vispy/util/tests/test_docstring_parameters.py +123 -0
- vispy/util/tests/test_emitter_group.py +262 -0
- vispy/util/tests/test_event_emitter.py +743 -0
- vispy/util/tests/test_fourier.py +35 -0
- vispy/util/tests/test_gallery_scraper.py +112 -0
- vispy/util/tests/test_import.py +127 -0
- vispy/util/tests/test_key.py +22 -0
- vispy/util/tests/test_logging.py +45 -0
- vispy/util/tests/test_run.py +14 -0
- vispy/util/tests/test_transforms.py +42 -0
- vispy/util/tests/test_vispy.py +48 -0
- vispy/util/transforms.py +201 -0
- vispy/util/wrappers.py +155 -0
- vispy/version.py +21 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +487 -0
- vispy/visuals/axis.py +678 -0
- vispy/visuals/border.py +208 -0
- vispy/visuals/box.py +79 -0
- vispy/visuals/collections/__init__.py +30 -0
- vispy/visuals/collections/agg_fast_path_collection.py +219 -0
- vispy/visuals/collections/agg_path_collection.py +197 -0
- vispy/visuals/collections/agg_point_collection.py +52 -0
- vispy/visuals/collections/agg_segment_collection.py +142 -0
- vispy/visuals/collections/array_list.py +401 -0
- vispy/visuals/collections/base_collection.py +482 -0
- vispy/visuals/collections/collection.py +253 -0
- vispy/visuals/collections/path_collection.py +23 -0
- vispy/visuals/collections/point_collection.py +19 -0
- vispy/visuals/collections/polygon_collection.py +25 -0
- vispy/visuals/collections/raw_path_collection.py +119 -0
- vispy/visuals/collections/raw_point_collection.py +113 -0
- vispy/visuals/collections/raw_polygon_collection.py +77 -0
- vispy/visuals/collections/raw_segment_collection.py +112 -0
- vispy/visuals/collections/raw_triangle_collection.py +78 -0
- vispy/visuals/collections/segment_collection.py +19 -0
- vispy/visuals/collections/triangle_collection.py +16 -0
- vispy/visuals/collections/util.py +168 -0
- vispy/visuals/colorbar.py +699 -0
- vispy/visuals/cube.py +41 -0
- vispy/visuals/ellipse.py +162 -0
- vispy/visuals/filters/__init__.py +10 -0
- vispy/visuals/filters/base_filter.py +242 -0
- vispy/visuals/filters/clipper.py +60 -0
- vispy/visuals/filters/clipping_planes.py +122 -0
- vispy/visuals/filters/color.py +181 -0
- vispy/visuals/filters/markers.py +28 -0
- vispy/visuals/filters/mesh.py +801 -0
- vispy/visuals/filters/picking.py +60 -0
- vispy/visuals/filters/tests/__init__.py +3 -0
- vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
- vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
- vispy/visuals/glsl/__init__.py +1 -0
- vispy/visuals/glsl/antialiasing.py +133 -0
- vispy/visuals/glsl/color.py +63 -0
- vispy/visuals/graphs/__init__.py +1 -0
- vispy/visuals/graphs/graph.py +240 -0
- vispy/visuals/graphs/layouts/__init__.py +55 -0
- vispy/visuals/graphs/layouts/circular.py +49 -0
- vispy/visuals/graphs/layouts/force_directed.py +211 -0
- vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
- vispy/visuals/graphs/layouts/random.py +52 -0
- vispy/visuals/graphs/tests/__init__.py +1 -0
- vispy/visuals/graphs/tests/test_layouts.py +139 -0
- vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
- vispy/visuals/graphs/util.py +120 -0
- vispy/visuals/gridlines.py +161 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +701 -0
- vispy/visuals/image_complex.py +130 -0
- vispy/visuals/infinite_line.py +199 -0
- vispy/visuals/instanced_mesh.py +152 -0
- vispy/visuals/isocurve.py +213 -0
- vispy/visuals/isoline.py +241 -0
- vispy/visuals/isosurface.py +113 -0
- vispy/visuals/line/__init__.py +6 -0
- vispy/visuals/line/arrow.py +289 -0
- vispy/visuals/line/dash_atlas.py +90 -0
- vispy/visuals/line/line.py +545 -0
- vispy/visuals/line_plot.py +135 -0
- vispy/visuals/linear_region.py +199 -0
- vispy/visuals/markers.py +819 -0
- vispy/visuals/mesh.py +373 -0
- vispy/visuals/mesh_normals.py +159 -0
- vispy/visuals/plane.py +54 -0
- vispy/visuals/polygon.py +145 -0
- vispy/visuals/rectangle.py +196 -0
- vispy/visuals/regular_polygon.py +56 -0
- vispy/visuals/scrolling_lines.py +197 -0
- vispy/visuals/shaders/__init__.py +17 -0
- vispy/visuals/shaders/compiler.py +206 -0
- vispy/visuals/shaders/expression.py +99 -0
- vispy/visuals/shaders/function.py +788 -0
- vispy/visuals/shaders/multiprogram.py +145 -0
- vispy/visuals/shaders/parsing.py +140 -0
- vispy/visuals/shaders/program.py +161 -0
- vispy/visuals/shaders/shader_object.py +162 -0
- vispy/visuals/shaders/tests/__init__.py +0 -0
- vispy/visuals/shaders/tests/test_function.py +486 -0
- vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
- vispy/visuals/shaders/tests/test_parsing.py +57 -0
- vispy/visuals/shaders/variable.py +272 -0
- vispy/visuals/spectrogram.py +169 -0
- vispy/visuals/sphere.py +80 -0
- vispy/visuals/surface_plot.py +192 -0
- vispy/visuals/tests/__init__.py +0 -0
- vispy/visuals/tests/test_arrows.py +109 -0
- vispy/visuals/tests/test_axis.py +120 -0
- vispy/visuals/tests/test_collections.py +15 -0
- vispy/visuals/tests/test_colorbar.py +179 -0
- vispy/visuals/tests/test_colormap.py +97 -0
- vispy/visuals/tests/test_ellipse.py +122 -0
- vispy/visuals/tests/test_gridlines.py +30 -0
- vispy/visuals/tests/test_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +392 -0
- vispy/visuals/tests/test_image_complex.py +36 -0
- vispy/visuals/tests/test_infinite_line.py +53 -0
- vispy/visuals/tests/test_instanced_mesh.py +50 -0
- vispy/visuals/tests/test_isosurface.py +22 -0
- vispy/visuals/tests/test_linear_region.py +152 -0
- vispy/visuals/tests/test_markers.py +54 -0
- vispy/visuals/tests/test_mesh.py +261 -0
- vispy/visuals/tests/test_mesh_normals.py +218 -0
- vispy/visuals/tests/test_polygon.py +112 -0
- vispy/visuals/tests/test_rectangle.py +163 -0
- vispy/visuals/tests/test_regular_polygon.py +111 -0
- vispy/visuals/tests/test_scalable_textures.py +196 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -0
- vispy/visuals/tests/test_surface_plot.py +57 -0
- vispy/visuals/tests/test_text.py +95 -0
- vispy/visuals/tests/test_volume.py +542 -0
- vispy/visuals/tests/test_windbarb.py +33 -0
- vispy/visuals/text/__init__.py +7 -0
- vispy/visuals/text/_sdf_cpu.cpython-313-x86_64-linux-gnu.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +112 -0
- vispy/visuals/text/_sdf_gpu.py +316 -0
- vispy/visuals/text/text.py +675 -0
- vispy/visuals/transforms/__init__.py +34 -0
- vispy/visuals/transforms/_util.py +191 -0
- vispy/visuals/transforms/base_transform.py +233 -0
- vispy/visuals/transforms/chain.py +300 -0
- vispy/visuals/transforms/interactive.py +98 -0
- vispy/visuals/transforms/linear.py +564 -0
- vispy/visuals/transforms/nonlinear.py +398 -0
- vispy/visuals/transforms/tests/__init__.py +0 -0
- vispy/visuals/transforms/tests/test_transforms.py +243 -0
- vispy/visuals/transforms/transform_system.py +339 -0
- vispy/visuals/tube.py +173 -0
- vispy/visuals/visual.py +923 -0
- vispy/visuals/volume.py +1366 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.15.0.dist-info/METADATA +243 -0
- vispy-0.15.0.dist-info/RECORD +521 -0
- vispy-0.15.0.dist-info/WHEEL +6 -0
- vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
- vispy-0.15.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
|
|
5
|
+
import struct
|
|
6
|
+
|
|
7
|
+
from .base_filter import Filter
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class PickingFilter(Filter):
|
|
11
|
+
"""Filter used to color visuals by a picking ID.
|
|
12
|
+
|
|
13
|
+
Note that the ID color uses the alpha channel, so this may not be used
|
|
14
|
+
with blending enabled.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
FRAG_SHADER = """
|
|
18
|
+
void picking_filter() {
|
|
19
|
+
if( $enabled == 0 )
|
|
20
|
+
return;
|
|
21
|
+
if( gl_FragColor.a == 0.0 )
|
|
22
|
+
discard;
|
|
23
|
+
gl_FragColor = $id_color;
|
|
24
|
+
}
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__(self, id_=None):
|
|
28
|
+
super(PickingFilter, self).__init__(fcode=self.FRAG_SHADER, fpos=10)
|
|
29
|
+
|
|
30
|
+
self.id = id_
|
|
31
|
+
self.enabled = False
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def id(self):
|
|
35
|
+
return self._id
|
|
36
|
+
|
|
37
|
+
@id.setter
|
|
38
|
+
def id(self, id):
|
|
39
|
+
if id < 1:
|
|
40
|
+
raise ValueError('Picking ID must be integer > 0.')
|
|
41
|
+
id_color = struct.unpack('<4B', struct.pack('<I', id))
|
|
42
|
+
self.fshader['id_color'] = [x/255. for x in id_color]
|
|
43
|
+
self._id = id
|
|
44
|
+
self._id_color = id_color
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def enabled(self):
|
|
48
|
+
return self._enabled
|
|
49
|
+
|
|
50
|
+
@enabled.setter
|
|
51
|
+
def enabled(self, e):
|
|
52
|
+
self._enabled = e
|
|
53
|
+
self.fshader['enabled'] = 1 if e is True else 0
|
|
54
|
+
|
|
55
|
+
@property
|
|
56
|
+
def color(self):
|
|
57
|
+
"""The RGBA color that will be drawn to the framebuffer for visuals
|
|
58
|
+
that use this filter.
|
|
59
|
+
"""
|
|
60
|
+
return self._id_color
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
import numpy as np
|
|
5
|
+
|
|
6
|
+
from vispy.geometry import create_plane
|
|
7
|
+
from vispy.scene.visuals import Markers, Mesh
|
|
8
|
+
from vispy.testing import requires_application, TestingCanvas
|
|
9
|
+
from vispy.visuals.filters import FacePickingFilter, MarkerPickingFilter
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def test_empty_mesh_face_picking():
|
|
13
|
+
mesh = Mesh()
|
|
14
|
+
filter = FacePickingFilter()
|
|
15
|
+
mesh.attach(filter)
|
|
16
|
+
filter.enabled = True
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@requires_application()
|
|
20
|
+
def test_mesh_face_picking():
|
|
21
|
+
vertices, faces, _ = create_plane(125, 125)
|
|
22
|
+
vertices = vertices["position"]
|
|
23
|
+
vertices[:, :2] += 125 / 2
|
|
24
|
+
mesh = Mesh(vertices=vertices, faces=faces)
|
|
25
|
+
filter = FacePickingFilter()
|
|
26
|
+
mesh.attach(filter)
|
|
27
|
+
|
|
28
|
+
with TestingCanvas(size=(125, 125)) as c:
|
|
29
|
+
view = c.central_widget.add_view()
|
|
30
|
+
view.add(mesh)
|
|
31
|
+
filter.enabled = True
|
|
32
|
+
mesh.update_gl_state(blend=False)
|
|
33
|
+
picking_render = c.render(bgcolor=(0, 0, 0, 0), alpha=True)
|
|
34
|
+
|
|
35
|
+
# unpack the IDs
|
|
36
|
+
ids = picking_render.view(np.uint32)
|
|
37
|
+
# the plane is made up of two triangles and nearly fills the view
|
|
38
|
+
# pick one point on each triangle
|
|
39
|
+
assert ids[125 // 2, 125 // 4] == 1
|
|
40
|
+
assert ids[125 // 2, 3 * 125 // 4] == 2
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_empty_markers_picking():
|
|
44
|
+
markers = Markers()
|
|
45
|
+
filter = MarkerPickingFilter()
|
|
46
|
+
markers.attach(filter)
|
|
47
|
+
filter.enabled = True
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@requires_application()
|
|
51
|
+
def test_markers_picking():
|
|
52
|
+
markers = Markers(
|
|
53
|
+
pos=np.array([[-0.5, -0.5], [0.5, 0.5]]),
|
|
54
|
+
size=5,
|
|
55
|
+
)
|
|
56
|
+
filter = MarkerPickingFilter()
|
|
57
|
+
markers.attach(filter)
|
|
58
|
+
|
|
59
|
+
with TestingCanvas(size=(125, 125)) as c:
|
|
60
|
+
view = c.central_widget.add_view(camera="panzoom")
|
|
61
|
+
view.camera.rect = (-1, -1, 2, 2)
|
|
62
|
+
view.add(markers)
|
|
63
|
+
|
|
64
|
+
filter.enabled = True
|
|
65
|
+
markers.update_gl_state(blend=False)
|
|
66
|
+
picking_render = c.render(bgcolor=(0, 0, 0, 0), alpha=True)
|
|
67
|
+
ids = picking_render.view(np.uint32)
|
|
68
|
+
|
|
69
|
+
assert ids[3 * 125 // 4, 125 // 4] == 1
|
|
70
|
+
assert ids[125 // 4, 3 * 125 // 4] == 2
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
|
|
5
|
+
from vispy.visuals.mesh import MeshVisual
|
|
6
|
+
from vispy.visuals.filters import WireframeFilter
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def test_empty_mesh_wireframe():
|
|
10
|
+
"""Test that an empty mesh does not cause issues with wireframe filter"""
|
|
11
|
+
mesh = MeshVisual()
|
|
12
|
+
wf = WireframeFilter()
|
|
13
|
+
mesh.attach(wf)
|
|
14
|
+
|
|
15
|
+
# trigger update of filter
|
|
16
|
+
wf.enabled = True
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Repository of common GLSL functions."""
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Copyright (c) 2014, Nicolas P. Rougier. All Rights Reserved.
|
|
2
|
+
# Distributed under the (new) BSD License.
|
|
3
|
+
|
|
4
|
+
"""Antialiasing GLSL functions."""
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
# -----------------------------------------------------------------------------
|
|
8
|
+
# Stroke
|
|
9
|
+
# -----------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
"""Compute antialiased fragment color for a stroke line.
|
|
12
|
+
|
|
13
|
+
Inputs:
|
|
14
|
+
|
|
15
|
+
- distance (float): Signed distance to border (in pixels).
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
Template variables:
|
|
19
|
+
|
|
20
|
+
- linewidth (float): Stroke line width (in pixels).
|
|
21
|
+
- antialias (float): Stroke antialiased area (in pixels).
|
|
22
|
+
- stroke (vec4): Stroke color.
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
Outputs:
|
|
26
|
+
|
|
27
|
+
- color (vec4): The final color.
|
|
28
|
+
|
|
29
|
+
"""
|
|
30
|
+
ANTIALIAS_STROKE = """
|
|
31
|
+
vec4 stroke(float distance)
|
|
32
|
+
{
|
|
33
|
+
vec4 frag_color;
|
|
34
|
+
float t = $linewidth/2.0 - $antialias;
|
|
35
|
+
float signed_distance = distance;
|
|
36
|
+
float border_distance = abs(signed_distance) - t;
|
|
37
|
+
float alpha = border_distance/$antialias;
|
|
38
|
+
alpha = exp(-alpha*alpha);
|
|
39
|
+
|
|
40
|
+
if( border_distance < 0.0 )
|
|
41
|
+
frag_color = $stroke;
|
|
42
|
+
else
|
|
43
|
+
frag_color = vec4($stroke.rgb, $stroke.a * alpha);
|
|
44
|
+
|
|
45
|
+
return frag_color;
|
|
46
|
+
}
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
# -----------------------------------------------------------------------------
|
|
51
|
+
# Stroke
|
|
52
|
+
# -----------------------------------------------------------------------------
|
|
53
|
+
|
|
54
|
+
"""Compute antialiased fragment color for an outlined shape.
|
|
55
|
+
|
|
56
|
+
Inputs:
|
|
57
|
+
|
|
58
|
+
- distance (float): Signed distance to border (in pixels).
|
|
59
|
+
|
|
60
|
+
Template variables:
|
|
61
|
+
|
|
62
|
+
- linewidth (float): Stroke line width (in pixels).
|
|
63
|
+
- antialias (float): Stroke antialiased area (in pixels).
|
|
64
|
+
- stroke (vec4): Stroke color.
|
|
65
|
+
- fill (vec4): Fill color.
|
|
66
|
+
|
|
67
|
+
Outputs:
|
|
68
|
+
|
|
69
|
+
- color (vec4): The final color.
|
|
70
|
+
|
|
71
|
+
"""
|
|
72
|
+
ANTIALIAS_OUTLINE = """
|
|
73
|
+
vec4 outline(float distance)
|
|
74
|
+
{
|
|
75
|
+
vec4 frag_color;
|
|
76
|
+
float t = $linewidth/2.0 - $antialias;
|
|
77
|
+
float signed_distance = distance;
|
|
78
|
+
float border_distance = abs(signed_distance) - t;
|
|
79
|
+
float alpha = border_distance/$antialias;
|
|
80
|
+
alpha = exp(-alpha*alpha);
|
|
81
|
+
|
|
82
|
+
if( border_distance < 0.0 )
|
|
83
|
+
frag_color = $stroke;
|
|
84
|
+
else if( signed_distance < 0.0 )
|
|
85
|
+
frag_color = mix($fill, $stroke, sqrt(alpha));
|
|
86
|
+
else
|
|
87
|
+
frag_color = vec4($stroke.rgb, $stroke.a * alpha);
|
|
88
|
+
return frag_color;
|
|
89
|
+
}
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# -----------------------------------------------------------------------------
|
|
94
|
+
# Filled
|
|
95
|
+
# -----------------------------------------------------------------------------
|
|
96
|
+
|
|
97
|
+
"""Compute antialiased fragment color for a filled shape.
|
|
98
|
+
|
|
99
|
+
Inputs:
|
|
100
|
+
|
|
101
|
+
- distance (float): Signed distance to border (in pixels).
|
|
102
|
+
|
|
103
|
+
Template variables:
|
|
104
|
+
|
|
105
|
+
- linewidth (float): Stroke line width (in pixels).
|
|
106
|
+
- antialias (float): Stroke antialiased area (in pixels).
|
|
107
|
+
- fill (vec4): Fill color.
|
|
108
|
+
|
|
109
|
+
Outputs:
|
|
110
|
+
|
|
111
|
+
- color (vec4): The final color.
|
|
112
|
+
|
|
113
|
+
"""
|
|
114
|
+
ANTIALIAS_FILLED = """
|
|
115
|
+
vec4 filled(float distance)
|
|
116
|
+
{
|
|
117
|
+
vec4 frag_color;
|
|
118
|
+
float t = $linewidth/2.0 - $antialias;
|
|
119
|
+
float signed_distance = distance;
|
|
120
|
+
float border_distance = abs(signed_distance) - t;
|
|
121
|
+
float alpha = border_distance/$antialias;
|
|
122
|
+
alpha = exp(-alpha*alpha);
|
|
123
|
+
|
|
124
|
+
if( border_distance < 0.0 )
|
|
125
|
+
frag_color = $fill;
|
|
126
|
+
else if( signed_distance < 0.0 )
|
|
127
|
+
frag_color = $fill;
|
|
128
|
+
else
|
|
129
|
+
frag_color = vec4($fill.rgb, alpha * $fill.a);
|
|
130
|
+
|
|
131
|
+
return frag_color;
|
|
132
|
+
}
|
|
133
|
+
"""
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""Color-related GLSL functions."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
# -----------------------------------------------------------------------------
|
|
5
|
+
# Colormaps
|
|
6
|
+
# -----------------------------------------------------------------------------
|
|
7
|
+
|
|
8
|
+
"""Texture lookup for a discrete color map stored in a 1*ncolors 2D texture.
|
|
9
|
+
|
|
10
|
+
The `get_color()` function returns a RGB color from an index integer
|
|
11
|
+
referring to the colormap.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
Inputs:
|
|
15
|
+
|
|
16
|
+
- index (int): The color index.
|
|
17
|
+
|
|
18
|
+
Template variables:
|
|
19
|
+
|
|
20
|
+
- $ncolors (int): The number of colors in the colormap.
|
|
21
|
+
- $colormap (2D texture sampler): The sampler for the 2D 1*ncolors colormap texture.
|
|
22
|
+
|
|
23
|
+
Outputs:
|
|
24
|
+
|
|
25
|
+
- color (vec3): The color.
|
|
26
|
+
|
|
27
|
+
"""
|
|
28
|
+
COLORMAP_TEXTURE = """
|
|
29
|
+
vec3 get_color(int index) {
|
|
30
|
+
float x = (float(index) + .5) / float($ncolors);
|
|
31
|
+
return texture2D($colormap, vec2(x, .5)).rgb;
|
|
32
|
+
}
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# -----------------------------------------------------------------------------
|
|
37
|
+
# Color space transformations
|
|
38
|
+
# -----------------------------------------------------------------------------
|
|
39
|
+
|
|
40
|
+
# From http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl
|
|
41
|
+
# TODO: unit tests
|
|
42
|
+
HSV_TO_RGB = """
|
|
43
|
+
vec3 hsv_to_rgb(vec3 c)
|
|
44
|
+
{
|
|
45
|
+
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
|
|
46
|
+
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
|
|
47
|
+
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
|
|
48
|
+
}
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
RGB_TO_HSV = """
|
|
53
|
+
vec3 rgb_to_hsv(vec3 c)
|
|
54
|
+
{
|
|
55
|
+
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
|
|
56
|
+
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
|
|
57
|
+
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));
|
|
58
|
+
|
|
59
|
+
float d = q.x - min(q.w, q.y);
|
|
60
|
+
float e = 1.0e-10;
|
|
61
|
+
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
|
|
62
|
+
}
|
|
63
|
+
"""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .graph import GraphVisual # noqa
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
"""
|
|
5
|
+
Graph Visual
|
|
6
|
+
============
|
|
7
|
+
|
|
8
|
+
This visual can be used to visualise graphs or networks.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from ..visual import CompoundVisual
|
|
12
|
+
from ..line import ArrowVisual
|
|
13
|
+
from ..markers import MarkersVisual
|
|
14
|
+
from . import layouts
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class GraphVisual(CompoundVisual):
|
|
18
|
+
"""Visual for displaying graphs or networks.
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
adjacency_mat : array or sparse
|
|
23
|
+
The adjacency matrix of the graph.
|
|
24
|
+
directed : bool
|
|
25
|
+
Whether the graph is directed or not. If True, then this visual will
|
|
26
|
+
draw arrows for the directed edges.
|
|
27
|
+
layout : str
|
|
28
|
+
They layout to use.
|
|
29
|
+
animate : bool
|
|
30
|
+
Whether or not to animate.
|
|
31
|
+
line_color : str or :class:`vispy.color.colormap.ColorMap`
|
|
32
|
+
The color to use for the edges.
|
|
33
|
+
line_width : number
|
|
34
|
+
The edge thickness.
|
|
35
|
+
arrow_type : str
|
|
36
|
+
The kind of arrow head to use. See :class:`vispy.visuals.ArrowHead`
|
|
37
|
+
for more information.
|
|
38
|
+
arrow_size : number
|
|
39
|
+
The size of the arrow head.
|
|
40
|
+
node_symbol : string
|
|
41
|
+
The marker to use for nodes. See
|
|
42
|
+
:class:`vispy.visuals.MarkersVisual` for more information.
|
|
43
|
+
node_size : number
|
|
44
|
+
The size of the node
|
|
45
|
+
border_color : str or :class:`vispy.color.colormap.ColorMap`
|
|
46
|
+
The border color for nodes.
|
|
47
|
+
face_color : str or :class:`vispy.color.colormap.ColorMap`
|
|
48
|
+
The face color for nodes.
|
|
49
|
+
border_width : number
|
|
50
|
+
The border size for nodes.
|
|
51
|
+
|
|
52
|
+
See Also
|
|
53
|
+
--------
|
|
54
|
+
ArrowVisual, MarkersVisual
|
|
55
|
+
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
_arrow_attributes = ('arrow_type', 'arrow_size')
|
|
59
|
+
_arrow_kwargs = ('line_color', 'line_width')
|
|
60
|
+
_node_kwargs = ('node_symbol', 'node_size', 'border_color', 'face_color',
|
|
61
|
+
'border_width')
|
|
62
|
+
|
|
63
|
+
_arrow_kw_trans = dict(line_color='color', line_width='width')
|
|
64
|
+
_node_kw_trans = dict(node_symbol='symbol', node_size='size',
|
|
65
|
+
border_color='edge_color', border_width='edge_width')
|
|
66
|
+
_node_properties_args = ()
|
|
67
|
+
|
|
68
|
+
def __init__(self, adjacency_mat=None, directed=False, layout=None,
|
|
69
|
+
animate=False, line_color=None, line_width=None,
|
|
70
|
+
arrow_type=None, arrow_size=None, node_symbol=None,
|
|
71
|
+
node_size=None, border_color=None, face_color=None,
|
|
72
|
+
border_width=None):
|
|
73
|
+
|
|
74
|
+
self._edges = ArrowVisual(method='gl', connect='segments')
|
|
75
|
+
self._nodes = MarkersVisual()
|
|
76
|
+
|
|
77
|
+
self._arrow_data = {}
|
|
78
|
+
self._node_data = {}
|
|
79
|
+
self._node_properties = {}
|
|
80
|
+
|
|
81
|
+
self._adjacency_mat = None
|
|
82
|
+
|
|
83
|
+
self._layout = None
|
|
84
|
+
self._layout_iter = None
|
|
85
|
+
self.layout = layout
|
|
86
|
+
|
|
87
|
+
self._directed = directed
|
|
88
|
+
self.directed = directed
|
|
89
|
+
|
|
90
|
+
self._animate = False
|
|
91
|
+
self.animate = animate
|
|
92
|
+
|
|
93
|
+
CompoundVisual.__init__(self, [self._edges, self._nodes])
|
|
94
|
+
|
|
95
|
+
self.set_data(adjacency_mat, line_color=line_color,
|
|
96
|
+
line_width=line_width, arrow_type=arrow_type,
|
|
97
|
+
arrow_size=arrow_size, node_symbol=node_symbol,
|
|
98
|
+
node_size=node_size, border_color=border_color,
|
|
99
|
+
face_color=face_color, border_width=border_width)
|
|
100
|
+
|
|
101
|
+
@property
|
|
102
|
+
def adjacency_matrix(self):
|
|
103
|
+
return self._adjacency_mat
|
|
104
|
+
|
|
105
|
+
@property
|
|
106
|
+
def layout(self):
|
|
107
|
+
return self._layout
|
|
108
|
+
|
|
109
|
+
@layout.setter
|
|
110
|
+
def layout(self, value):
|
|
111
|
+
if isinstance(value, str):
|
|
112
|
+
self._layout = layouts.get_layout(value)
|
|
113
|
+
else:
|
|
114
|
+
assert callable(value)
|
|
115
|
+
self._layout = value
|
|
116
|
+
|
|
117
|
+
self._layout_iter = None
|
|
118
|
+
|
|
119
|
+
@property
|
|
120
|
+
def directed(self):
|
|
121
|
+
return self._directed
|
|
122
|
+
|
|
123
|
+
@directed.setter
|
|
124
|
+
def directed(self, value):
|
|
125
|
+
self._directed = bool(value)
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def animate(self):
|
|
129
|
+
return self._animate
|
|
130
|
+
|
|
131
|
+
@animate.setter
|
|
132
|
+
def animate(self, value):
|
|
133
|
+
self._animate = bool(value)
|
|
134
|
+
|
|
135
|
+
def animate_layout(self):
|
|
136
|
+
if self._layout_iter is None:
|
|
137
|
+
if self._adjacency_mat is None:
|
|
138
|
+
raise ValueError("No adjacency matrix set yet. An adjacency "
|
|
139
|
+
"matrix is required to calculate the layout.")
|
|
140
|
+
|
|
141
|
+
self._layout_iter = iter(self._layout(self._adjacency_mat,
|
|
142
|
+
self._directed))
|
|
143
|
+
|
|
144
|
+
try:
|
|
145
|
+
node_vertices, line_vertices, arrows = next(self._layout_iter)
|
|
146
|
+
except StopIteration:
|
|
147
|
+
return True
|
|
148
|
+
|
|
149
|
+
self._nodes.set_data(pos=node_vertices, **self._node_data)
|
|
150
|
+
for k, v in self._node_properties.items():
|
|
151
|
+
setattr(self._nodes, k, v)
|
|
152
|
+
|
|
153
|
+
self._edges.set_data(pos=line_vertices, arrows=arrows,
|
|
154
|
+
**self._arrow_data)
|
|
155
|
+
|
|
156
|
+
return False
|
|
157
|
+
|
|
158
|
+
def set_final_layout(self):
|
|
159
|
+
if self._layout_iter is None:
|
|
160
|
+
if self._adjacency_mat is None:
|
|
161
|
+
raise ValueError("No adjacency matrix set yet. An adjacency "
|
|
162
|
+
"matrix is required to calculate the layout.")
|
|
163
|
+
|
|
164
|
+
self._layout_iter = iter(self._layout(self._adjacency_mat,
|
|
165
|
+
self._directed))
|
|
166
|
+
|
|
167
|
+
# Calculate the final position of the nodes and lines
|
|
168
|
+
node_vertices = None
|
|
169
|
+
line_vertices = None
|
|
170
|
+
arrows = None
|
|
171
|
+
for node_vertices, line_vertices, arrows in self._layout_iter:
|
|
172
|
+
pass
|
|
173
|
+
|
|
174
|
+
self._nodes.set_data(pos=node_vertices, **self._node_data)
|
|
175
|
+
for k, v in self._node_properties.items():
|
|
176
|
+
setattr(self._nodes, k, v)
|
|
177
|
+
|
|
178
|
+
self._edges.set_data(pos=line_vertices, arrows=arrows,
|
|
179
|
+
**self._arrow_data)
|
|
180
|
+
|
|
181
|
+
def reset_layout(self):
|
|
182
|
+
self._layout_iter = None
|
|
183
|
+
|
|
184
|
+
def set_data(self, adjacency_mat=None, **kwargs):
|
|
185
|
+
"""Set the data
|
|
186
|
+
|
|
187
|
+
Parameters
|
|
188
|
+
----------
|
|
189
|
+
adjacency_mat : ndarray | None
|
|
190
|
+
The adjacency matrix.
|
|
191
|
+
**kwargs : dict
|
|
192
|
+
Keyword arguments to pass to the arrows.
|
|
193
|
+
"""
|
|
194
|
+
if adjacency_mat is not None:
|
|
195
|
+
if adjacency_mat.shape[0] != adjacency_mat.shape[1]:
|
|
196
|
+
raise ValueError("Adjacency matrix should be square.")
|
|
197
|
+
|
|
198
|
+
self._adjacency_mat = adjacency_mat
|
|
199
|
+
|
|
200
|
+
for k in self._arrow_attributes:
|
|
201
|
+
if k in kwargs:
|
|
202
|
+
translated = (self._arrow_kw_trans[k] if k in
|
|
203
|
+
self._arrow_kw_trans else k)
|
|
204
|
+
|
|
205
|
+
setattr(self._edges, translated, kwargs.pop(k))
|
|
206
|
+
|
|
207
|
+
arrow_kwargs = {}
|
|
208
|
+
for k in self._arrow_kwargs:
|
|
209
|
+
if k in kwargs:
|
|
210
|
+
translated = (self._arrow_kw_trans[k] if k in
|
|
211
|
+
self._arrow_kw_trans else k)
|
|
212
|
+
|
|
213
|
+
arrow_kwargs[translated] = kwargs.pop(k)
|
|
214
|
+
|
|
215
|
+
node_kwargs = {}
|
|
216
|
+
for k in self._node_kwargs:
|
|
217
|
+
if k in kwargs:
|
|
218
|
+
translated = (self._node_kw_trans[k] if k in
|
|
219
|
+
self._node_kw_trans else k)
|
|
220
|
+
|
|
221
|
+
node_kwargs[translated] = kwargs.pop(k)
|
|
222
|
+
|
|
223
|
+
if len(kwargs) > 0:
|
|
224
|
+
raise TypeError("%s.set_data() got invalid keyword arguments: %s"
|
|
225
|
+
% (self.__class__.__name__, list(kwargs.keys())))
|
|
226
|
+
|
|
227
|
+
# some attributes should be set as properties
|
|
228
|
+
node_properties = {}
|
|
229
|
+
for k, v in list(node_kwargs.items()):
|
|
230
|
+
if k in (self._node_properties_args):
|
|
231
|
+
node_properties[k] = node_kwargs.pop(k)
|
|
232
|
+
|
|
233
|
+
# The actual data is set in GraphVisual.animate_layout or
|
|
234
|
+
# GraphVisual.set_final_layout
|
|
235
|
+
self._arrow_data = arrow_kwargs
|
|
236
|
+
self._node_data = node_kwargs
|
|
237
|
+
self._node_properties = node_properties
|
|
238
|
+
|
|
239
|
+
if not self._animate:
|
|
240
|
+
self.set_final_layout()
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
|
|
5
|
+
import inspect
|
|
6
|
+
|
|
7
|
+
from .random import random
|
|
8
|
+
from .circular import circular
|
|
9
|
+
from .force_directed import fruchterman_reingold
|
|
10
|
+
from .networkx_layout import NetworkxCoordinates
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
_layout_map = {
|
|
14
|
+
'random': random,
|
|
15
|
+
'circular': circular,
|
|
16
|
+
'force_directed': fruchterman_reingold,
|
|
17
|
+
'spring_layout': fruchterman_reingold,
|
|
18
|
+
"networkx_layout": NetworkxCoordinates,
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
AVAILABLE_LAYOUTS = tuple(_layout_map.keys())
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def get_layout(name, *args, **kwargs):
|
|
25
|
+
"""
|
|
26
|
+
Retrieve a graph layout
|
|
27
|
+
|
|
28
|
+
Some graph layouts accept extra options. Please refer to their
|
|
29
|
+
documentation for more information.
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
name : string
|
|
34
|
+
The name of the layout. The variable `AVAILABLE_LAYOUTS`
|
|
35
|
+
contains all available layouts.
|
|
36
|
+
*args
|
|
37
|
+
Positional arguments which are passed to the layout.
|
|
38
|
+
**kwargs
|
|
39
|
+
Keyword arguments which are passed to the layout.
|
|
40
|
+
|
|
41
|
+
Returns
|
|
42
|
+
-------
|
|
43
|
+
layout : callable
|
|
44
|
+
The callable generator which will calculate the graph layout
|
|
45
|
+
"""
|
|
46
|
+
if name not in _layout_map:
|
|
47
|
+
raise KeyError("Graph layout '%s' not found. Should be one of %s"
|
|
48
|
+
% (name, AVAILABLE_LAYOUTS))
|
|
49
|
+
|
|
50
|
+
layout = _layout_map[name]
|
|
51
|
+
|
|
52
|
+
if inspect.isclass(layout):
|
|
53
|
+
layout = layout(*args, **kwargs)
|
|
54
|
+
|
|
55
|
+
return layout
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
"""
|
|
5
|
+
Circular Layout
|
|
6
|
+
===============
|
|
7
|
+
|
|
8
|
+
This module contains several graph layouts which rely heavily on circles.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import numpy as np
|
|
12
|
+
|
|
13
|
+
from ..util import _straight_line_vertices, issparse
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def circular(adjacency_mat, directed=False):
|
|
17
|
+
"""Places all nodes on a single circle.
|
|
18
|
+
|
|
19
|
+
Parameters
|
|
20
|
+
----------
|
|
21
|
+
adjacency_mat : matrix or sparse
|
|
22
|
+
The graph adjacency matrix
|
|
23
|
+
directed : bool
|
|
24
|
+
Whether the graph is directed. If this is True, is will also
|
|
25
|
+
generate the vertices for arrows, which can be passed to an
|
|
26
|
+
ArrowVisual.
|
|
27
|
+
|
|
28
|
+
Yields
|
|
29
|
+
------
|
|
30
|
+
(node_vertices, line_vertices, arrow_vertices) : tuple
|
|
31
|
+
Yields the node and line vertices in a tuple. This layout only yields a
|
|
32
|
+
single time, and has no builtin animation
|
|
33
|
+
"""
|
|
34
|
+
if issparse(adjacency_mat):
|
|
35
|
+
adjacency_mat = adjacency_mat.tocoo()
|
|
36
|
+
|
|
37
|
+
num_nodes = adjacency_mat.shape[0]
|
|
38
|
+
|
|
39
|
+
t = np.linspace(0, 2 * np.pi, num_nodes, endpoint=False)
|
|
40
|
+
|
|
41
|
+
# Visual coordinate system is between 0 and 1, so generate a circle with
|
|
42
|
+
# radius 0.5 and center it at the point (0.5, 0.5).
|
|
43
|
+
node_coords = (0.5 * np.array([np.cos(t), np.sin(t)]) + 0.5).T
|
|
44
|
+
node_coords = node_coords.astype(np.float32)
|
|
45
|
+
|
|
46
|
+
line_vertices, arrows = _straight_line_vertices(adjacency_mat,
|
|
47
|
+
node_coords, directed)
|
|
48
|
+
|
|
49
|
+
yield node_coords, line_vertices, arrows
|