vispy 0.15.0__cp313-cp313-macosx_11_0_arm64.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-darwin.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
vispy/plot/plotwidget.py
ADDED
|
@@ -0,0 +1,522 @@
|
|
|
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 ..import scene
|
|
6
|
+
from ..io import read_mesh
|
|
7
|
+
from ..geometry import MeshData
|
|
8
|
+
|
|
9
|
+
__all__ = ['PlotWidget']
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class PlotWidget(scene.Widget):
|
|
13
|
+
"""Widget to facilitate plotting
|
|
14
|
+
|
|
15
|
+
Parameters
|
|
16
|
+
----------
|
|
17
|
+
*args : arguments
|
|
18
|
+
Arguments passed to the `ViewBox` super class.
|
|
19
|
+
**kwargs : keywoard arguments
|
|
20
|
+
Keyword arguments passed to the `ViewBox` super class.
|
|
21
|
+
|
|
22
|
+
Notes
|
|
23
|
+
-----
|
|
24
|
+
This class is typically instantiated implicitly by a `Figure`
|
|
25
|
+
instance, e.g., by doing ``fig[0, 0]``.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, *args, **kwargs):
|
|
29
|
+
self._fg = kwargs.pop('fg_color', 'k')
|
|
30
|
+
self.grid = None
|
|
31
|
+
self.camera = None
|
|
32
|
+
self.title = None
|
|
33
|
+
self.title_widget = None
|
|
34
|
+
self.yaxis = None
|
|
35
|
+
self.xaxis = None
|
|
36
|
+
self.xlabel = None
|
|
37
|
+
self.ylabel = None
|
|
38
|
+
self._configured = False
|
|
39
|
+
self.visuals = []
|
|
40
|
+
self.section_y_x = None
|
|
41
|
+
|
|
42
|
+
self.cbar_top = None
|
|
43
|
+
self.cbar_bottom = None
|
|
44
|
+
self.cbar_left = None
|
|
45
|
+
self.cbar_right = None
|
|
46
|
+
|
|
47
|
+
super(PlotWidget, self).__init__(*args, **kwargs)
|
|
48
|
+
self.grid = self.add_grid(spacing=0, margin=10)
|
|
49
|
+
|
|
50
|
+
self.title = scene.Label("", font_size=16, color="#ff0000")
|
|
51
|
+
|
|
52
|
+
def _configure_2d(self, fg_color=None):
|
|
53
|
+
if self._configured:
|
|
54
|
+
return
|
|
55
|
+
|
|
56
|
+
if fg_color is None:
|
|
57
|
+
fg = self._fg
|
|
58
|
+
else:
|
|
59
|
+
fg = fg_color
|
|
60
|
+
|
|
61
|
+
# c0 c1 c2 c3 c4 c5 c6
|
|
62
|
+
# r0 +---------+-------+-------+-------+-------+---------+---------+
|
|
63
|
+
# | | | title | | |
|
|
64
|
+
# r1 | +-----------------------+-------+---------+ |
|
|
65
|
+
# | | | cbar | | |
|
|
66
|
+
# r2 | +-------+-------+-------+-------+---------+ |
|
|
67
|
+
# | | cbar | ylabel| yaxis | view | cbar | padding |
|
|
68
|
+
# r3 | padding +-------+-------+-------+-------+---------+ |
|
|
69
|
+
# | | | xaxis | | |
|
|
70
|
+
# r4 | +-----------------------+-------+---------+ |
|
|
71
|
+
# | | | xlabel| | |
|
|
72
|
+
# r5 | +-----------------------+-------+---------+ |
|
|
73
|
+
# | | | cbar | | |
|
|
74
|
+
# r6 |---------+-----------------------+-------+---------+---------|
|
|
75
|
+
# | padding |
|
|
76
|
+
# +---------+-----------------------+-------+---------+---------+
|
|
77
|
+
|
|
78
|
+
# padding left
|
|
79
|
+
padding_left = self.grid.add_widget(None, row=0, row_span=5, col=0)
|
|
80
|
+
padding_left.width_min = 30
|
|
81
|
+
padding_left.width_max = 60
|
|
82
|
+
|
|
83
|
+
# padding right
|
|
84
|
+
padding_right = self.grid.add_widget(None, row=0, row_span=5, col=6)
|
|
85
|
+
padding_right.width_min = 30
|
|
86
|
+
padding_right.width_max = 60
|
|
87
|
+
|
|
88
|
+
# padding right
|
|
89
|
+
padding_bottom = self.grid.add_widget(None, row=6, col=0, col_span=6)
|
|
90
|
+
padding_bottom.height_min = 20
|
|
91
|
+
padding_bottom.height_max = 40
|
|
92
|
+
|
|
93
|
+
# row 0
|
|
94
|
+
# title - column 4 to 5
|
|
95
|
+
self.title_widget = self.grid.add_widget(self.title, row=0, col=4)
|
|
96
|
+
self.title_widget.height_min = self.title_widget.height_max = 40
|
|
97
|
+
|
|
98
|
+
# row 1
|
|
99
|
+
# colorbar - column 4 to 5
|
|
100
|
+
self.cbar_top = self.grid.add_widget(None, row=1, col=4)
|
|
101
|
+
self.cbar_top.height_max = 1
|
|
102
|
+
|
|
103
|
+
# row 2
|
|
104
|
+
# colorbar_left - column 1
|
|
105
|
+
# ylabel - column 2
|
|
106
|
+
# yaxis - column 3
|
|
107
|
+
# view - column 4
|
|
108
|
+
# colorbar_right - column 5
|
|
109
|
+
self.cbar_left = self.grid.add_widget(None, row=2, col=1)
|
|
110
|
+
self.cbar_left.width_max = 1
|
|
111
|
+
|
|
112
|
+
self.ylabel = scene.Label("", rotation=-90)
|
|
113
|
+
ylabel_widget = self.grid.add_widget(self.ylabel, row=2, col=2)
|
|
114
|
+
ylabel_widget.width_max = 1
|
|
115
|
+
|
|
116
|
+
self.yaxis = scene.AxisWidget(orientation='left',
|
|
117
|
+
text_color=fg,
|
|
118
|
+
axis_color=fg, tick_color=fg)
|
|
119
|
+
|
|
120
|
+
yaxis_widget = self.grid.add_widget(self.yaxis, row=2, col=3)
|
|
121
|
+
yaxis_widget.width_max = 40
|
|
122
|
+
|
|
123
|
+
# row 3
|
|
124
|
+
# xaxis - column 4
|
|
125
|
+
self.xaxis = scene.AxisWidget(orientation='bottom', text_color=fg,
|
|
126
|
+
axis_color=fg, tick_color=fg)
|
|
127
|
+
xaxis_widget = self.grid.add_widget(self.xaxis, row=3, col=4)
|
|
128
|
+
xaxis_widget.height_max = 40
|
|
129
|
+
|
|
130
|
+
self.cbar_right = self.grid.add_widget(None, row=2, col=5)
|
|
131
|
+
self.cbar_right.width_max = 1
|
|
132
|
+
|
|
133
|
+
# row 4
|
|
134
|
+
# xlabel - column 4
|
|
135
|
+
self.xlabel = scene.Label("")
|
|
136
|
+
xlabel_widget = self.grid.add_widget(self.xlabel, row=4, col=4)
|
|
137
|
+
xlabel_widget.height_max = 40
|
|
138
|
+
|
|
139
|
+
# row 5
|
|
140
|
+
self.cbar_bottom = self.grid.add_widget(None, row=5, col=4)
|
|
141
|
+
self.cbar_bottom.height_max = 1
|
|
142
|
+
|
|
143
|
+
# This needs to be added to the grid last (to fix #1742)
|
|
144
|
+
self.view = self.grid.add_view(row=2, col=4,
|
|
145
|
+
border_color='grey', bgcolor="#efefef")
|
|
146
|
+
self.view.camera = 'panzoom'
|
|
147
|
+
self.camera = self.view.camera
|
|
148
|
+
|
|
149
|
+
self._configured = True
|
|
150
|
+
self.xaxis.link_view(self.view)
|
|
151
|
+
self.yaxis.link_view(self.view)
|
|
152
|
+
|
|
153
|
+
def _configure_3d(self):
|
|
154
|
+
if self._configured:
|
|
155
|
+
return
|
|
156
|
+
|
|
157
|
+
self.view = self.grid.add_view(row=0, col=0,
|
|
158
|
+
border_color='grey', bgcolor="#efefef")
|
|
159
|
+
|
|
160
|
+
self.view.camera = 'turntable'
|
|
161
|
+
self.camera = self.view.camera
|
|
162
|
+
|
|
163
|
+
self._configured = True
|
|
164
|
+
|
|
165
|
+
def histogram(self, data, bins=10, color='w', orientation='h'):
|
|
166
|
+
"""Calculate and show a histogram of data
|
|
167
|
+
|
|
168
|
+
Parameters
|
|
169
|
+
----------
|
|
170
|
+
data : array-like
|
|
171
|
+
Data to histogram. Currently only 1D data is supported.
|
|
172
|
+
bins : int | array-like
|
|
173
|
+
Number of bins, or bin edges.
|
|
174
|
+
color : instance of Color
|
|
175
|
+
Color of the histogram.
|
|
176
|
+
orientation : {'h', 'v'}
|
|
177
|
+
Orientation of the histogram.
|
|
178
|
+
|
|
179
|
+
Returns
|
|
180
|
+
-------
|
|
181
|
+
hist : instance of Polygon
|
|
182
|
+
The histogram polygon.
|
|
183
|
+
"""
|
|
184
|
+
self._configure_2d()
|
|
185
|
+
hist = scene.Histogram(data, bins, color, orientation)
|
|
186
|
+
self.view.add(hist)
|
|
187
|
+
self.view.camera.set_range()
|
|
188
|
+
return hist
|
|
189
|
+
|
|
190
|
+
def image(self, data, cmap='cubehelix', clim='auto', fg_color=None, **kwargs):
|
|
191
|
+
"""Show an image
|
|
192
|
+
|
|
193
|
+
Parameters
|
|
194
|
+
----------
|
|
195
|
+
data : ndarray
|
|
196
|
+
Should have shape (N, M), (N, M, 3) or (N, M, 4).
|
|
197
|
+
cmap : str
|
|
198
|
+
Colormap name.
|
|
199
|
+
clim : str | tuple
|
|
200
|
+
Colormap limits. Should be ``'auto'`` or a two-element tuple of
|
|
201
|
+
min and max values.
|
|
202
|
+
fg_color : Color or None
|
|
203
|
+
Sets the plot foreground color if specified.
|
|
204
|
+
kwargs : keyword arguments.
|
|
205
|
+
More args to pass to :class:`~vispy.visuals.image.Image`.
|
|
206
|
+
|
|
207
|
+
Returns
|
|
208
|
+
-------
|
|
209
|
+
image : instance of Image
|
|
210
|
+
The image.
|
|
211
|
+
|
|
212
|
+
Notes
|
|
213
|
+
-----
|
|
214
|
+
The colormap is only used if the image pixels are scalars.
|
|
215
|
+
"""
|
|
216
|
+
self._configure_2d(fg_color)
|
|
217
|
+
image = scene.Image(data, cmap=cmap, clim=clim, **kwargs)
|
|
218
|
+
self.view.add(image)
|
|
219
|
+
self.view.camera.aspect = 1
|
|
220
|
+
self.view.camera.set_range()
|
|
221
|
+
|
|
222
|
+
return image
|
|
223
|
+
|
|
224
|
+
def mesh(self, vertices=None, faces=None, vertex_colors=None,
|
|
225
|
+
face_colors=None, color=(0.5, 0.5, 1.), fname=None,
|
|
226
|
+
meshdata=None, shading='auto'):
|
|
227
|
+
"""Show a 3D mesh
|
|
228
|
+
|
|
229
|
+
Parameters
|
|
230
|
+
----------
|
|
231
|
+
vertices : array
|
|
232
|
+
Vertices.
|
|
233
|
+
faces : array | None
|
|
234
|
+
Face definitions.
|
|
235
|
+
vertex_colors : array | None
|
|
236
|
+
Vertex colors.
|
|
237
|
+
face_colors : array | None
|
|
238
|
+
Face colors.
|
|
239
|
+
color : instance of Color
|
|
240
|
+
Color to use.
|
|
241
|
+
fname : str | None
|
|
242
|
+
Filename to load. If not None, then vertices, faces, and meshdata
|
|
243
|
+
must be None.
|
|
244
|
+
meshdata : MeshData | None
|
|
245
|
+
Meshdata to use. If not None, then vertices, faces, and fname
|
|
246
|
+
must be None.
|
|
247
|
+
shading : str
|
|
248
|
+
Shading to use, can be None, 'smooth', 'flat', or 'auto'.
|
|
249
|
+
Default ('auto') will use None if face_colors is set, and
|
|
250
|
+
'smooth' otherwise.
|
|
251
|
+
|
|
252
|
+
Returns
|
|
253
|
+
-------
|
|
254
|
+
mesh : instance of Mesh
|
|
255
|
+
The mesh.
|
|
256
|
+
"""
|
|
257
|
+
self._configure_3d()
|
|
258
|
+
if shading == 'auto':
|
|
259
|
+
shading = 'smooth'
|
|
260
|
+
if face_colors is not None:
|
|
261
|
+
shading = None
|
|
262
|
+
if fname is not None:
|
|
263
|
+
if not all(x is None for x in (vertices, faces, meshdata)):
|
|
264
|
+
raise ValueError('vertices, faces, and meshdata must be None '
|
|
265
|
+
'if fname is not None')
|
|
266
|
+
vertices, faces = read_mesh(fname)[:2]
|
|
267
|
+
if meshdata is not None:
|
|
268
|
+
if not all(x is None for x in (vertices, faces, fname)):
|
|
269
|
+
raise ValueError('vertices, faces, and fname must be None if '
|
|
270
|
+
'meshdata is not None')
|
|
271
|
+
else:
|
|
272
|
+
meshdata = MeshData(vertices, faces, vertex_colors=vertex_colors,
|
|
273
|
+
face_colors=face_colors)
|
|
274
|
+
mesh = scene.Mesh(meshdata=meshdata, vertex_colors=vertex_colors,
|
|
275
|
+
face_colors=face_colors, color=color,
|
|
276
|
+
shading=shading)
|
|
277
|
+
self.view.add(mesh)
|
|
278
|
+
self.view.camera.set_range()
|
|
279
|
+
return mesh
|
|
280
|
+
|
|
281
|
+
def plot(self, data, color='k', symbol=None, line_kind='-', width=1.,
|
|
282
|
+
marker_size=10., edge_color='k', face_color='b', edge_width=1.,
|
|
283
|
+
title=None, xlabel=None, ylabel=None, connect='strip'):
|
|
284
|
+
"""Plot a series of data using lines and markers
|
|
285
|
+
|
|
286
|
+
Parameters
|
|
287
|
+
----------
|
|
288
|
+
data : array | two arrays
|
|
289
|
+
Arguments can be passed as ``(Y,)``, ``(X, Y)`` or
|
|
290
|
+
``np.array((X, Y))``.
|
|
291
|
+
color : instance of Color
|
|
292
|
+
Color of the line.
|
|
293
|
+
symbol : str
|
|
294
|
+
Marker symbol to use.
|
|
295
|
+
line_kind : str
|
|
296
|
+
Kind of line to draw. For now, only solid lines (``'-'``)
|
|
297
|
+
are supported.
|
|
298
|
+
width : float
|
|
299
|
+
Line width.
|
|
300
|
+
marker_size : float
|
|
301
|
+
Marker size. If `size == 0` markers will not be shown.
|
|
302
|
+
edge_color : instance of Color
|
|
303
|
+
Color of the marker edge.
|
|
304
|
+
face_color : instance of Color
|
|
305
|
+
Color of the marker face.
|
|
306
|
+
edge_width : float
|
|
307
|
+
Edge width of the marker.
|
|
308
|
+
title : str | None
|
|
309
|
+
The title string to be displayed above the plot
|
|
310
|
+
xlabel : str | None
|
|
311
|
+
The label to display along the bottom axis
|
|
312
|
+
ylabel : str | None
|
|
313
|
+
The label to display along the left axis.
|
|
314
|
+
connect : str | array
|
|
315
|
+
Determines which vertices are connected by lines.
|
|
316
|
+
|
|
317
|
+
Returns
|
|
318
|
+
-------
|
|
319
|
+
line : instance of LinePlot
|
|
320
|
+
The line plot.
|
|
321
|
+
|
|
322
|
+
See also
|
|
323
|
+
--------
|
|
324
|
+
LinePlot
|
|
325
|
+
"""
|
|
326
|
+
self._configure_2d()
|
|
327
|
+
line = scene.LinePlot(data, connect=connect, color=color,
|
|
328
|
+
symbol=symbol, line_kind=line_kind,
|
|
329
|
+
width=width, marker_size=marker_size,
|
|
330
|
+
edge_color=edge_color,
|
|
331
|
+
face_color=face_color,
|
|
332
|
+
edge_width=edge_width)
|
|
333
|
+
self.view.add(line)
|
|
334
|
+
self.view.camera.set_range()
|
|
335
|
+
self.visuals.append(line)
|
|
336
|
+
|
|
337
|
+
if title is not None:
|
|
338
|
+
self.title.text = title
|
|
339
|
+
if xlabel is not None:
|
|
340
|
+
self.xlabel.text = xlabel
|
|
341
|
+
if ylabel is not None:
|
|
342
|
+
self.ylabel.text = ylabel
|
|
343
|
+
|
|
344
|
+
return line
|
|
345
|
+
|
|
346
|
+
def spectrogram(self, x, n_fft=256, step=None, fs=1., window='hann',
|
|
347
|
+
normalize=False, color_scale='log', cmap='cubehelix',
|
|
348
|
+
clim='auto'):
|
|
349
|
+
"""Calculate and show a spectrogram
|
|
350
|
+
|
|
351
|
+
Parameters
|
|
352
|
+
----------
|
|
353
|
+
x : array-like
|
|
354
|
+
1D signal to operate on. ``If len(x) < n_fft``, x will be
|
|
355
|
+
zero-padded to length ``n_fft``.
|
|
356
|
+
n_fft : int
|
|
357
|
+
Number of FFT points. Much faster for powers of two.
|
|
358
|
+
step : int | None
|
|
359
|
+
Step size between calculations. If None, ``n_fft // 2``
|
|
360
|
+
will be used.
|
|
361
|
+
fs : float
|
|
362
|
+
The sample rate of the data.
|
|
363
|
+
window : str | None
|
|
364
|
+
Window function to use. Can be ``'hann'`` for Hann window, or None
|
|
365
|
+
for no windowing.
|
|
366
|
+
normalize : bool
|
|
367
|
+
Normalization of spectrogram values across frequencies.
|
|
368
|
+
color_scale : {'linear', 'log'}
|
|
369
|
+
Scale to apply to the result of the STFT.
|
|
370
|
+
``'log'`` will use ``10 * log10(power)``.
|
|
371
|
+
cmap : str
|
|
372
|
+
Colormap name.
|
|
373
|
+
clim : str | tuple
|
|
374
|
+
Colormap limits. Should be ``'auto'`` or a two-element tuple of
|
|
375
|
+
min and max values.
|
|
376
|
+
|
|
377
|
+
Returns
|
|
378
|
+
-------
|
|
379
|
+
spec : instance of Spectrogram
|
|
380
|
+
The spectrogram.
|
|
381
|
+
|
|
382
|
+
See also
|
|
383
|
+
--------
|
|
384
|
+
Image
|
|
385
|
+
"""
|
|
386
|
+
self._configure_2d()
|
|
387
|
+
# XXX once we have axes, we should use "fft_freqs", too
|
|
388
|
+
spec = scene.Spectrogram(x, n_fft, step, fs, window,
|
|
389
|
+
normalize, color_scale, cmap, clim)
|
|
390
|
+
self.view.add(spec)
|
|
391
|
+
self.view.camera.set_range()
|
|
392
|
+
return spec
|
|
393
|
+
|
|
394
|
+
def volume(self, vol, clim=None, method='mip', threshold=None,
|
|
395
|
+
cmap='grays', **kwargs):
|
|
396
|
+
"""Show a 3D volume
|
|
397
|
+
|
|
398
|
+
Parameters
|
|
399
|
+
----------
|
|
400
|
+
vol : ndarray
|
|
401
|
+
Volume to render.
|
|
402
|
+
clim : tuple of two floats | None
|
|
403
|
+
The contrast limits. The values in the volume are mapped to
|
|
404
|
+
black and white corresponding to these values. Default maps
|
|
405
|
+
between min and max.
|
|
406
|
+
method : {'mip', 'iso', 'translucent', 'additive'}
|
|
407
|
+
The render style to use. See corresponding docs for details.
|
|
408
|
+
Default 'mip'.
|
|
409
|
+
threshold : float
|
|
410
|
+
The threshold to use for the isosurafce render style. By default
|
|
411
|
+
the mean of the given volume is used.
|
|
412
|
+
cmap : str
|
|
413
|
+
The colormap to use.
|
|
414
|
+
kwargs : keyword arguments.
|
|
415
|
+
More args to pass to :class:`~vispy.visuals.volume.Volume`.
|
|
416
|
+
|
|
417
|
+
Returns
|
|
418
|
+
-------
|
|
419
|
+
volume : instance of Volume
|
|
420
|
+
The volume visualization.
|
|
421
|
+
|
|
422
|
+
See also
|
|
423
|
+
--------
|
|
424
|
+
Volume
|
|
425
|
+
"""
|
|
426
|
+
self._configure_3d()
|
|
427
|
+
volume = scene.Volume(vol, clim, method, threshold, cmap=cmap, **kwargs)
|
|
428
|
+
self.view.add(volume)
|
|
429
|
+
self.view.camera.set_range()
|
|
430
|
+
return volume
|
|
431
|
+
|
|
432
|
+
def surface(self, zdata, **kwargs):
|
|
433
|
+
"""Show a 3D surface plot.
|
|
434
|
+
|
|
435
|
+
Extra keyword arguments are passed to `SurfacePlot()`.
|
|
436
|
+
|
|
437
|
+
Parameters
|
|
438
|
+
----------
|
|
439
|
+
zdata : array-like
|
|
440
|
+
A 2D array of the surface Z values.
|
|
441
|
+
|
|
442
|
+
"""
|
|
443
|
+
self._configure_3d()
|
|
444
|
+
surf = scene.SurfacePlot(z=zdata, **kwargs)
|
|
445
|
+
self.view.add(surf)
|
|
446
|
+
self.view.camera.set_range()
|
|
447
|
+
return surf
|
|
448
|
+
|
|
449
|
+
def colorbar(self, cmap, position="right",
|
|
450
|
+
label="", clim=("", ""),
|
|
451
|
+
border_width=0.0, border_color="black",
|
|
452
|
+
**kwargs):
|
|
453
|
+
"""Show a ColorBar
|
|
454
|
+
|
|
455
|
+
Parameters
|
|
456
|
+
----------
|
|
457
|
+
cmap : str | vispy.color.ColorMap
|
|
458
|
+
Either the name of the ColorMap to be used from the standard
|
|
459
|
+
set of names (refer to `vispy.color.get_colormap`),
|
|
460
|
+
or a custom ColorMap object.
|
|
461
|
+
The ColorMap is used to apply a gradient on the colorbar.
|
|
462
|
+
position : {'left', 'right', 'top', 'bottom'}
|
|
463
|
+
The position of the colorbar with respect to the plot.
|
|
464
|
+
'top' and 'bottom' are placed horizontally, while
|
|
465
|
+
'left' and 'right' are placed vertically
|
|
466
|
+
label : str
|
|
467
|
+
The label that is to be drawn with the colorbar
|
|
468
|
+
that provides information about the colorbar.
|
|
469
|
+
clim : tuple (min, max)
|
|
470
|
+
the minimum and maximum values of the data that
|
|
471
|
+
is given to the colorbar. This is used to draw the scale
|
|
472
|
+
on the side of the colorbar.
|
|
473
|
+
border_width : float (in px)
|
|
474
|
+
The width of the border the colormap should have. This measurement
|
|
475
|
+
is given in pixels
|
|
476
|
+
border_color : str | vispy.color.Color
|
|
477
|
+
The color of the border of the colormap. This can either be a
|
|
478
|
+
str as the color's name or an actual instace of a vipy.color.Color
|
|
479
|
+
|
|
480
|
+
Returns
|
|
481
|
+
-------
|
|
482
|
+
colorbar : instance of ColorBarWidget
|
|
483
|
+
|
|
484
|
+
See also
|
|
485
|
+
--------
|
|
486
|
+
ColorBarWidget
|
|
487
|
+
"""
|
|
488
|
+
self._configure_2d()
|
|
489
|
+
|
|
490
|
+
cbar = scene.ColorBarWidget(orientation=position,
|
|
491
|
+
label=label,
|
|
492
|
+
cmap=cmap,
|
|
493
|
+
clim=clim,
|
|
494
|
+
border_width=border_width,
|
|
495
|
+
border_color=border_color,
|
|
496
|
+
**kwargs)
|
|
497
|
+
|
|
498
|
+
CBAR_LONG_DIM = 50
|
|
499
|
+
|
|
500
|
+
if cbar.orientation == "bottom":
|
|
501
|
+
self.grid.remove_widget(self.cbar_bottom)
|
|
502
|
+
self.cbar_bottom = self.grid.add_widget(cbar, row=5, col=4)
|
|
503
|
+
self.cbar_bottom.height_max = \
|
|
504
|
+
self.cbar_bottom.height_max = CBAR_LONG_DIM
|
|
505
|
+
|
|
506
|
+
elif cbar.orientation == "top":
|
|
507
|
+
self.grid.remove_widget(self.cbar_top)
|
|
508
|
+
self.cbar_top = self.grid.add_widget(cbar, row=1, col=4)
|
|
509
|
+
self.cbar_top.height_max = self.cbar_top.height_max = CBAR_LONG_DIM
|
|
510
|
+
|
|
511
|
+
elif cbar.orientation == "left":
|
|
512
|
+
self.grid.remove_widget(self.cbar_left)
|
|
513
|
+
self.cbar_left = self.grid.add_widget(cbar, row=2, col=1)
|
|
514
|
+
self.cbar_left.width_max = self.cbar_left.width_min = CBAR_LONG_DIM
|
|
515
|
+
|
|
516
|
+
else: # cbar.orientation == "right"
|
|
517
|
+
self.grid.remove_widget(self.cbar_right)
|
|
518
|
+
self.cbar_right = self.grid.add_widget(cbar, row=2, col=5)
|
|
519
|
+
self.cbar_right.width_max = \
|
|
520
|
+
self.cbar_right.width_min = CBAR_LONG_DIM
|
|
521
|
+
|
|
522
|
+
return cbar
|
|
File without changes
|
|
@@ -0,0 +1,46 @@
|
|
|
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 vispy.plot as vp
|
|
6
|
+
from vispy.testing import (assert_raises, requires_application,
|
|
7
|
+
run_tests_if_main)
|
|
8
|
+
from vispy.visuals.axis import AxisVisual
|
|
9
|
+
from unittest import mock
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@requires_application()
|
|
13
|
+
def test_figure_creation():
|
|
14
|
+
"""Test creating a figure"""
|
|
15
|
+
with vp.Fig(show=False) as fig:
|
|
16
|
+
fig[0, 0:2]
|
|
17
|
+
fig[1:3, 0:2]
|
|
18
|
+
ax_right = fig[1:3, 2]
|
|
19
|
+
assert fig[1:3, 2] is ax_right
|
|
20
|
+
# collision
|
|
21
|
+
assert_raises(ValueError, fig.__getitem__, (slice(1, 3), 1))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@requires_application()
|
|
25
|
+
def test_plot_widget_axes():
|
|
26
|
+
"""Test that the axes domains are updated correctly when a figure is first drawn"""
|
|
27
|
+
fig = vp.Fig(size=(800, 800), show=False)
|
|
28
|
+
point = (0, 100)
|
|
29
|
+
fig[0, 0].plot((point, point))
|
|
30
|
+
# mocking the AxisVisual domain.setter
|
|
31
|
+
domain_setter = mock.Mock(wraps=AxisVisual.domain.fset)
|
|
32
|
+
mock_property = AxisVisual.domain.setter(domain_setter)
|
|
33
|
+
|
|
34
|
+
with mock.patch.object(AxisVisual, "domain", mock_property):
|
|
35
|
+
# note: fig.show() must be called for this test to work... otherwise
|
|
36
|
+
# Grid._update_child_widget_dim is not triggered and the axes aren't updated
|
|
37
|
+
fig.show(run=False)
|
|
38
|
+
# currently, the AxisWidget adds a buffer of 5% of the
|
|
39
|
+
# full range to either end of the axis domain
|
|
40
|
+
buffer = (point[1] - point[0]) * 0.05
|
|
41
|
+
expectation = [point[0] - buffer, point[1] + buffer]
|
|
42
|
+
for call in domain_setter.call_args_list:
|
|
43
|
+
assert [round(x, 2) for x in call[0][1]] == expectation
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
run_tests_if_main()
|
vispy/scene/__init__.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
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
|
+
The vispy.scene subpackage provides high-level, flexible, and easy to use
|
|
6
|
+
functionality for creating scenes composed of multiple visual objects.
|
|
7
|
+
|
|
8
|
+
Overview
|
|
9
|
+
--------
|
|
10
|
+
|
|
11
|
+
Scenegraphs are a commonly used system for describing a scene as a
|
|
12
|
+
hierarchy of visual objects. Users need only create these visual objects and
|
|
13
|
+
specify their location in the scene, and the scenegraph system will
|
|
14
|
+
automatically draw the entire scene whenever an update is required.
|
|
15
|
+
|
|
16
|
+
Using the vispy scenegraph requires only a few steps:
|
|
17
|
+
|
|
18
|
+
1. Create a SceneCanvas to display the scene. This object has a `scene`
|
|
19
|
+
property that is the top-level Node in the scene.
|
|
20
|
+
2. Create one or more Node instances (see vispy.scene.visuals)
|
|
21
|
+
3. Add these Node instances to the scene by making them children of
|
|
22
|
+
canvas.scene, or children of other nodes that are already in the scene.
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
For more information see:
|
|
26
|
+
|
|
27
|
+
* complete scenegraph documentation
|
|
28
|
+
* scene examples
|
|
29
|
+
* scene API reference
|
|
30
|
+
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from .visuals import * # noqa
|
|
34
|
+
from .cameras import * # noqa
|
|
35
|
+
from ..visuals.transforms import * # noqa
|
|
36
|
+
from .widgets import * # noqa
|
|
37
|
+
from .canvas import SceneCanvas # noqa
|
|
38
|
+
from . import visuals # noqa
|
|
39
|
+
from ..visuals import transforms # noqa
|
|
40
|
+
from ..visuals import filters # noqa
|
|
41
|
+
from . import widgets # noqa
|
|
42
|
+
from . import cameras # noqa
|
|
43
|
+
from .node import Node # noqa
|
|
@@ -0,0 +1,27 @@
|
|
|
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
|
+
Cameras are responsible for determining which part of a scene is displayed
|
|
6
|
+
in a viewbox and for handling user input to change the view.
|
|
7
|
+
|
|
8
|
+
Several Camera subclasses are available to customize the projection of the
|
|
9
|
+
scene such as 3D perspective and orthographic projections, 2D
|
|
10
|
+
scale/translation, and other specialty cameras. A variety of user interaction
|
|
11
|
+
styles are available for each camera including arcball, turntable,
|
|
12
|
+
first-person, and pan/zoom interactions.
|
|
13
|
+
|
|
14
|
+
Internally, Cameras work by setting the transform of a SubScene object such
|
|
15
|
+
that a certain part of the scene is mapped to the bounding rectangle of the
|
|
16
|
+
ViewBox.
|
|
17
|
+
"""
|
|
18
|
+
__all__ = ['ArcballCamera', 'BaseCamera', 'FlyCamera', 'MagnifyCamera',
|
|
19
|
+
'Magnify1DCamera', 'PanZoomCamera', 'TurntableCamera']
|
|
20
|
+
|
|
21
|
+
from ._base import make_camera # noqa
|
|
22
|
+
from .base_camera import BaseCamera # noqa
|
|
23
|
+
from .panzoom import PanZoomCamera # noqa
|
|
24
|
+
from .arcball import ArcballCamera # noqa
|
|
25
|
+
from .turntable import TurntableCamera # noqa
|
|
26
|
+
from .fly import FlyCamera # noqa
|
|
27
|
+
from .magnify import MagnifyCamera, Magnify1DCamera # noqa
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
from .base_camera import BaseCamera
|
|
5
|
+
from .perspective import PerspectiveCamera
|
|
6
|
+
from .panzoom import PanZoomCamera
|
|
7
|
+
from .arcball import ArcballCamera
|
|
8
|
+
from .turntable import TurntableCamera
|
|
9
|
+
from .fly import FlyCamera
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def make_camera(cam_type, *args, **kwargs):
|
|
13
|
+
"""Factory function for creating new cameras using a string name.
|
|
14
|
+
|
|
15
|
+
Parameters
|
|
16
|
+
----------
|
|
17
|
+
cam_type : str
|
|
18
|
+
May be one of:
|
|
19
|
+
|
|
20
|
+
* 'panzoom' : Creates :class:`PanZoomCamera`
|
|
21
|
+
* 'turntable' : Creates :class:`TurntableCamera`
|
|
22
|
+
* None : Creates :class:`Camera`
|
|
23
|
+
|
|
24
|
+
Notes
|
|
25
|
+
-----
|
|
26
|
+
All extra arguments are passed to the __init__ method of the selected
|
|
27
|
+
Camera class.
|
|
28
|
+
"""
|
|
29
|
+
cam_types = {None: BaseCamera}
|
|
30
|
+
for camType in (BaseCamera, PanZoomCamera, PerspectiveCamera,
|
|
31
|
+
TurntableCamera, FlyCamera, ArcballCamera):
|
|
32
|
+
cam_types[camType.__name__[:-6].lower()] = camType
|
|
33
|
+
|
|
34
|
+
try:
|
|
35
|
+
return cam_types[cam_type](*args, **kwargs)
|
|
36
|
+
except KeyError:
|
|
37
|
+
raise KeyError('Unknown camera type "%s". Options are: %s' %
|
|
38
|
+
(cam_type, cam_types.keys()))
|