vispy 0.14.0__cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.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 +968 -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 +1134 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +352 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1542 -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 +134 -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 +698 -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 +506 -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 +566 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1816 -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 +1045 -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 +106 -0
- vispy/scene/cameras/base_camera.py +538 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +308 -0
- vispy/scene/cameras/perspective.py +333 -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 +173 -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 +446 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +473 -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 +17 -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 +4 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +485 -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 +163 -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 +796 -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 +105 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +688 -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 +810 -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_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +390 -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 +180 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -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-312-aarch64-linux-gnu.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +110 -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 +1335 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.14.0.dist-info/LICENSE.txt +36 -0
- vispy-0.14.0.dist-info/METADATA +218 -0
- vispy-0.14.0.dist-info/RECORD +519 -0
- vispy-0.14.0.dist-info/WHEEL +6 -0
- vispy-0.14.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,699 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
# Author: Siddharth Bhat
|
|
7
|
+
# -----------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
from functools import lru_cache
|
|
10
|
+
|
|
11
|
+
import numpy as np
|
|
12
|
+
|
|
13
|
+
from . import Visual, TextVisual, CompoundVisual, _BorderVisual
|
|
14
|
+
# from .border import _BorderVisual
|
|
15
|
+
from .shaders import Function
|
|
16
|
+
from ..color import get_colormap
|
|
17
|
+
|
|
18
|
+
_VERTEX_SHADER = """
|
|
19
|
+
attribute vec2 a_position;
|
|
20
|
+
attribute vec2 a_texcoord;
|
|
21
|
+
varying vec2 v_texcoord;
|
|
22
|
+
|
|
23
|
+
void main() {
|
|
24
|
+
v_texcoord = a_texcoord;
|
|
25
|
+
gl_Position = $transform(vec4(a_position, 0, 1));
|
|
26
|
+
}
|
|
27
|
+
""" # noqa
|
|
28
|
+
|
|
29
|
+
_FRAGMENT_SHADER = """
|
|
30
|
+
varying vec2 v_texcoord;
|
|
31
|
+
|
|
32
|
+
void main()
|
|
33
|
+
{
|
|
34
|
+
// depending on orientation, we either use the x component or the inverted
|
|
35
|
+
// y component for texcoords
|
|
36
|
+
// (we get the texcoords inverted (with respect to the colormap)
|
|
37
|
+
// so let's invert it to make sure that the colorbar renders correctly)
|
|
38
|
+
vec4 mapped_color = $color_transform($orient_texcoord(v_texcoord));
|
|
39
|
+
gl_FragColor = mapped_color;
|
|
40
|
+
}
|
|
41
|
+
""" # noqa
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class _CoreColorBarVisual(Visual):
|
|
45
|
+
"""
|
|
46
|
+
Visual subclass that actually renders the ColorBar.
|
|
47
|
+
|
|
48
|
+
Parameters
|
|
49
|
+
----------
|
|
50
|
+
pos : tuple (x, y)
|
|
51
|
+
Position where the colorbar is to be placed with
|
|
52
|
+
respect to the center of the colorbar
|
|
53
|
+
halfdim : tuple (half_width, half_height)
|
|
54
|
+
Half the dimensions of the colorbar measured
|
|
55
|
+
from the center. That way, the total dimensions
|
|
56
|
+
of the colorbar is (x - half_width) to (x + half_width)
|
|
57
|
+
and (y - half_height) to (y + half_height)
|
|
58
|
+
cmap : str | vispy.color.ColorMap
|
|
59
|
+
Either the name of the ColorMap to be used from the standard
|
|
60
|
+
set of names (refer to `vispy.color.get_colormap`),
|
|
61
|
+
or a custom ColorMap object.
|
|
62
|
+
The ColorMap is used to apply a gradient on the colorbar.
|
|
63
|
+
orientation : {'left', 'right', 'top', 'bottom'}
|
|
64
|
+
The orientation of the colorbar, used for rendering. The
|
|
65
|
+
orientation can be thought of as the position of the label
|
|
66
|
+
relative to the color bar.
|
|
67
|
+
|
|
68
|
+
Note
|
|
69
|
+
----
|
|
70
|
+
This is purely internal.
|
|
71
|
+
Externally, the ColorBarVisual must be used.
|
|
72
|
+
This class was separated out to encapsulate rendering information
|
|
73
|
+
That way, ColorBar simply becomes a CompoundVisual
|
|
74
|
+
|
|
75
|
+
See Also
|
|
76
|
+
--------
|
|
77
|
+
vispy.visuals.ColorBarVisual
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
_shaders = {
|
|
81
|
+
'vertex': _VERTEX_SHADER,
|
|
82
|
+
'fragment': _FRAGMENT_SHADER,
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
def __init__(self, pos, halfdim,
|
|
86
|
+
cmap,
|
|
87
|
+
orientation,
|
|
88
|
+
**kwargs):
|
|
89
|
+
|
|
90
|
+
self._check_orientation(orientation)
|
|
91
|
+
self._cmap = get_colormap(cmap)
|
|
92
|
+
self._pos = pos
|
|
93
|
+
self._halfdim = halfdim
|
|
94
|
+
self._orientation = orientation
|
|
95
|
+
|
|
96
|
+
Visual.__init__(self, vcode=self._shaders['vertex'], fcode=self._shaders['fragment'])
|
|
97
|
+
|
|
98
|
+
texcoord_func = self._get_texcoord_func(orientation)
|
|
99
|
+
self.shared_program.frag['orient_texcoord'] = texcoord_func
|
|
100
|
+
|
|
101
|
+
tex_coords = np.array([[0, 0], [1, 0], [1, 1],
|
|
102
|
+
[0, 0], [1, 1], [0, 1]],
|
|
103
|
+
dtype=np.float32)
|
|
104
|
+
|
|
105
|
+
glsl_map_fn = Function(self._cmap.glsl_map)
|
|
106
|
+
|
|
107
|
+
self.shared_program.frag['color_transform'] = glsl_map_fn
|
|
108
|
+
self.shared_program['a_texcoord'] = tex_coords.astype(np.float32)
|
|
109
|
+
|
|
110
|
+
self._update()
|
|
111
|
+
|
|
112
|
+
def _update(self):
|
|
113
|
+
"""Rebuilds the shaders, and repositions the objects that are used internally by the ColorBarVisual"""
|
|
114
|
+
x, y = self._pos
|
|
115
|
+
halfw, halfh = self._halfdim
|
|
116
|
+
|
|
117
|
+
# test that width and height are non-zero
|
|
118
|
+
if halfw <= 0:
|
|
119
|
+
raise ValueError("half-width must be positive and non-zero"
|
|
120
|
+
", not %s" % halfw)
|
|
121
|
+
if halfh <= 0:
|
|
122
|
+
raise ValueError("half-height must be positive and non-zero"
|
|
123
|
+
", not %s" % halfh)
|
|
124
|
+
|
|
125
|
+
# test that the given width and height is consistent
|
|
126
|
+
# with the orientation
|
|
127
|
+
if (self._orientation == "bottom" or self._orientation == "top"):
|
|
128
|
+
if halfw < halfh:
|
|
129
|
+
raise ValueError("half-width(%s) < half-height(%s) for"
|
|
130
|
+
"%s orientation,"
|
|
131
|
+
" expected half-width >= half-height" %
|
|
132
|
+
(halfw, halfh, self._orientation, ))
|
|
133
|
+
else: # orientation == left or orientation == right
|
|
134
|
+
if halfw > halfh:
|
|
135
|
+
raise ValueError("half-width(%s) > half-height(%s) for"
|
|
136
|
+
"%s orientation,"
|
|
137
|
+
" expected half-width <= half-height" %
|
|
138
|
+
(halfw, halfh, self._orientation, ))
|
|
139
|
+
|
|
140
|
+
# Set up the attributes that the shaders require
|
|
141
|
+
vertices = np.array([[x - halfw, y - halfh],
|
|
142
|
+
[x + halfw, y - halfh],
|
|
143
|
+
[x + halfw, y + halfh],
|
|
144
|
+
# tri 2
|
|
145
|
+
[x - halfw, y - halfh],
|
|
146
|
+
[x + halfw, y + halfh],
|
|
147
|
+
[x - halfw, y + halfh]],
|
|
148
|
+
dtype=np.float32)
|
|
149
|
+
|
|
150
|
+
self.shared_program['a_position'] = vertices
|
|
151
|
+
|
|
152
|
+
self.shared_program['texture2D_LUT'] = self._cmap.texture_lut()
|
|
153
|
+
|
|
154
|
+
@staticmethod
|
|
155
|
+
@lru_cache(maxsize=4)
|
|
156
|
+
def _get_texcoord_func(orientation):
|
|
157
|
+
if orientation == "top" or orientation == "bottom":
|
|
158
|
+
func = Function("""
|
|
159
|
+
float orient_texcoord(vec2 texcoord) {
|
|
160
|
+
return texcoord.x;
|
|
161
|
+
}
|
|
162
|
+
""")
|
|
163
|
+
elif orientation == "left" or orientation == "right":
|
|
164
|
+
func = Function("""
|
|
165
|
+
float orient_texcoord(vec2 texcoord) {
|
|
166
|
+
return 1 - texcoord.y;
|
|
167
|
+
}
|
|
168
|
+
""")
|
|
169
|
+
return func
|
|
170
|
+
|
|
171
|
+
@staticmethod
|
|
172
|
+
def _check_orientation(orientation):
|
|
173
|
+
if orientation not in ('top', 'bottom', 'left', 'right'):
|
|
174
|
+
raise ValueError("orientation must"
|
|
175
|
+
" be one of 'top', 'bottom', "
|
|
176
|
+
"'left', or 'right', "
|
|
177
|
+
"not '%s'" % (orientation, ))
|
|
178
|
+
|
|
179
|
+
@property
|
|
180
|
+
def pos(self):
|
|
181
|
+
return self._pos
|
|
182
|
+
|
|
183
|
+
@pos.setter
|
|
184
|
+
def pos(self, pos):
|
|
185
|
+
self._pos = pos
|
|
186
|
+
self._update()
|
|
187
|
+
|
|
188
|
+
@property
|
|
189
|
+
def halfdim(self):
|
|
190
|
+
return self._halfdim
|
|
191
|
+
|
|
192
|
+
@halfdim.setter
|
|
193
|
+
def halfdim(self, halfdim):
|
|
194
|
+
self._halfdim = halfdim
|
|
195
|
+
|
|
196
|
+
@property
|
|
197
|
+
def cmap(self):
|
|
198
|
+
"""The colormap of the Colorbar"""
|
|
199
|
+
return self._cmap
|
|
200
|
+
|
|
201
|
+
@cmap.setter
|
|
202
|
+
def cmap(self, cmap):
|
|
203
|
+
self._cmap = get_colormap(cmap)
|
|
204
|
+
self._program.frag['color_transform'] = Function(self._cmap.glsl_map)
|
|
205
|
+
|
|
206
|
+
@staticmethod
|
|
207
|
+
def _prepare_transforms(view):
|
|
208
|
+
# figure out padding by considering the entire transform
|
|
209
|
+
# on the width and height
|
|
210
|
+
program = view.view_program
|
|
211
|
+
total_transform = view.transforms.get_transform()
|
|
212
|
+
program.vert['transform'] = total_transform
|
|
213
|
+
|
|
214
|
+
def _prepare_draw(self, view):
|
|
215
|
+
self._draw_mode = "triangles"
|
|
216
|
+
return True
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
class ColorBarVisual(CompoundVisual):
|
|
220
|
+
"""Visual subclass displaying a colorbar
|
|
221
|
+
|
|
222
|
+
Parameters
|
|
223
|
+
----------
|
|
224
|
+
cmap : str | vispy.color.ColorMap
|
|
225
|
+
Either the name of the ColorMap to be used from the standard
|
|
226
|
+
set of names (refer to `vispy.color.get_colormap`),
|
|
227
|
+
or a custom ColorMap object.
|
|
228
|
+
The ColorMap is used to apply a gradient on the colorbar.
|
|
229
|
+
orientation : {'left', 'right', 'top', 'bottom'}
|
|
230
|
+
The orientation of the colorbar, used for rendering. The
|
|
231
|
+
orientation can be thought of as the position of the label
|
|
232
|
+
relative to the color bar.
|
|
233
|
+
|
|
234
|
+
When the orientation is 'left' or 'right', the colorbar is
|
|
235
|
+
vertically placed. When it is 'top' or 'bottom', the colorbar is
|
|
236
|
+
horizontally placed.
|
|
237
|
+
|
|
238
|
+
* 'top': the colorbar is horizontal.
|
|
239
|
+
Color is applied from left to right.
|
|
240
|
+
Minimum corresponds to left and maximum to right.
|
|
241
|
+
Label is to the top of the colorbar
|
|
242
|
+
|
|
243
|
+
* 'bottom': Same as top, except that
|
|
244
|
+
label is to the bottom of the colorbar
|
|
245
|
+
|
|
246
|
+
* 'left': the colorbar is vertical.
|
|
247
|
+
Color is applied from bottom to top.
|
|
248
|
+
Minimum corresponds to bottom and maximum to top.
|
|
249
|
+
Label is to the left of the colorbar
|
|
250
|
+
|
|
251
|
+
* 'right': Same as left, except that the
|
|
252
|
+
label is placed to the right of the colorbar
|
|
253
|
+
|
|
254
|
+
size : (major_axis_length, minor_axis_length)
|
|
255
|
+
lengths with respect to the major and minor axes.
|
|
256
|
+
The minor axis is the shorter axis, while the major axis is
|
|
257
|
+
the longer axis with respect to the orientation
|
|
258
|
+
|
|
259
|
+
For orientations 'top' and 'bottom', the major axis is
|
|
260
|
+
along the length.
|
|
261
|
+
|
|
262
|
+
For orientations 'left' and 'right', the major axis is
|
|
263
|
+
along the breadth
|
|
264
|
+
pos : tuple (x, y)
|
|
265
|
+
Position where the colorbar is to be placed with
|
|
266
|
+
respect to the center of the colorbar
|
|
267
|
+
label : str | vispy.visuals.TextVisual
|
|
268
|
+
The label that is to be drawn with the colorbar
|
|
269
|
+
that provides information about the colorbar.
|
|
270
|
+
If a TextVisual object then 'label_color' is ignored.
|
|
271
|
+
label_color : str | vispy.color.Color
|
|
272
|
+
The color of the label and tick labels. This can either be a
|
|
273
|
+
str as the color's name or an actual instace of a vipy.color.Color
|
|
274
|
+
clim : tuple (min, max)
|
|
275
|
+
the minimum and maximum values of the data that
|
|
276
|
+
is given to the colorbar. This is used to draw the scale
|
|
277
|
+
on the side of the colorbar.
|
|
278
|
+
border_width : float (in px)
|
|
279
|
+
The width of the border the colormap should have. This measurement
|
|
280
|
+
is given in pixels
|
|
281
|
+
border_color : str | vispy.color.Color
|
|
282
|
+
The color of the border of the colormap. This can either be a
|
|
283
|
+
str as the color's name or an actual instace of a vipy.color.Color
|
|
284
|
+
|
|
285
|
+
.. versionchanged:: 0.7
|
|
286
|
+
|
|
287
|
+
Keyword argument ``label_str`` renamed to `label`.
|
|
288
|
+
|
|
289
|
+
"""
|
|
290
|
+
|
|
291
|
+
# The padding multiplier that's used to place the text
|
|
292
|
+
# next to the Colorbar. Makes sure the text isn't
|
|
293
|
+
# visually "sticking" to the Colorbar
|
|
294
|
+
text_padding_factor = 1.05
|
|
295
|
+
|
|
296
|
+
def __init__(self, cmap, orientation, size,
|
|
297
|
+
pos=[0, 0],
|
|
298
|
+
label="",
|
|
299
|
+
label_color='black',
|
|
300
|
+
clim=(0.0, 1.0),
|
|
301
|
+
border_width=1.0,
|
|
302
|
+
border_color="black"):
|
|
303
|
+
|
|
304
|
+
_CoreColorBarVisual._check_orientation(orientation)
|
|
305
|
+
self._cmap = get_colormap(cmap)
|
|
306
|
+
self._clim = clim
|
|
307
|
+
self._pos = pos
|
|
308
|
+
self._size = size
|
|
309
|
+
self._orientation = orientation
|
|
310
|
+
|
|
311
|
+
if not isinstance(label, TextVisual):
|
|
312
|
+
label = TextVisual(label, color=label_color)
|
|
313
|
+
self._label = label
|
|
314
|
+
|
|
315
|
+
self._ticks = []
|
|
316
|
+
self._ticks.append(TextVisual(str(self._clim[0]),
|
|
317
|
+
color=label_color))
|
|
318
|
+
self._ticks.append(TextVisual(str(self._clim[1]),
|
|
319
|
+
color=label_color))
|
|
320
|
+
|
|
321
|
+
if orientation in ["top", "bottom"]:
|
|
322
|
+
(width, height) = size
|
|
323
|
+
elif orientation in ["left", "right"]:
|
|
324
|
+
(height, width) = size
|
|
325
|
+
|
|
326
|
+
self._halfdim = (width * 0.5, height * 0.5)
|
|
327
|
+
|
|
328
|
+
self._colorbar = _CoreColorBarVisual(pos, self._halfdim,
|
|
329
|
+
cmap, orientation)
|
|
330
|
+
|
|
331
|
+
self._border = _BorderVisual(pos, self._halfdim,
|
|
332
|
+
border_width, border_color)
|
|
333
|
+
|
|
334
|
+
CompoundVisual.__init__(self, [self._colorbar,
|
|
335
|
+
self._border,
|
|
336
|
+
self._ticks[0],
|
|
337
|
+
self._ticks[1],
|
|
338
|
+
self._label,
|
|
339
|
+
])
|
|
340
|
+
self._update()
|
|
341
|
+
|
|
342
|
+
def _update(self):
|
|
343
|
+
"""Rebuilds the shaders, and repositions the objects that are used internally by the ColorBarVisual"""
|
|
344
|
+
self._colorbar.halfdim = self._halfdim
|
|
345
|
+
self._border.halfdim = self._halfdim
|
|
346
|
+
|
|
347
|
+
self._ticks[0].text = str(self._clim[0])
|
|
348
|
+
self._ticks[1].text = str(self._clim[1])
|
|
349
|
+
|
|
350
|
+
self._update_positions()
|
|
351
|
+
|
|
352
|
+
self._colorbar._update()
|
|
353
|
+
self._border._update()
|
|
354
|
+
|
|
355
|
+
def _update_positions(self):
|
|
356
|
+
"""Updates the positions of the colorbars and labels"""
|
|
357
|
+
self._colorbar.pos = self._pos
|
|
358
|
+
self._border.pos = self._pos
|
|
359
|
+
|
|
360
|
+
if self._orientation == "right" or self._orientation == "left":
|
|
361
|
+
self._label.rotation = -90
|
|
362
|
+
|
|
363
|
+
x, y = self._pos
|
|
364
|
+
halfw, halfh = self._halfdim
|
|
365
|
+
|
|
366
|
+
label_anchors = \
|
|
367
|
+
ColorBarVisual._get_label_anchors(center=self._pos,
|
|
368
|
+
halfdim=self._halfdim,
|
|
369
|
+
orientation=self._orientation,
|
|
370
|
+
transforms=self.label.transforms)
|
|
371
|
+
self._label.anchors = label_anchors
|
|
372
|
+
|
|
373
|
+
ticks_anchors = \
|
|
374
|
+
ColorBarVisual._get_ticks_anchors(center=self._pos,
|
|
375
|
+
halfdim=self._halfdim,
|
|
376
|
+
orientation=self._orientation,
|
|
377
|
+
transforms=self.label.transforms)
|
|
378
|
+
|
|
379
|
+
self._ticks[0].anchors = ticks_anchors
|
|
380
|
+
self._ticks[1].anchors = ticks_anchors
|
|
381
|
+
|
|
382
|
+
(label_pos, ticks_pos) = \
|
|
383
|
+
ColorBarVisual._calc_positions(center=self._pos,
|
|
384
|
+
halfdim=self._halfdim,
|
|
385
|
+
border_width=self.border_width,
|
|
386
|
+
orientation=self._orientation,
|
|
387
|
+
transforms=self.transforms)
|
|
388
|
+
|
|
389
|
+
self._label.pos = label_pos
|
|
390
|
+
self._ticks[0].pos = ticks_pos[0]
|
|
391
|
+
self._ticks[1].pos = ticks_pos[1]
|
|
392
|
+
|
|
393
|
+
@staticmethod
|
|
394
|
+
def _get_label_anchors(center, halfdim, orientation, transforms):
|
|
395
|
+
visual_to_doc = transforms.get_transform('visual', 'document')
|
|
396
|
+
|
|
397
|
+
doc_x = visual_to_doc.map(np.array([1, 0, 0, 0], dtype=np.float32))
|
|
398
|
+
doc_y = visual_to_doc.map(np.array([0, 1, 0, 0], dtype=np.float32))
|
|
399
|
+
|
|
400
|
+
if doc_x[0] < 0:
|
|
401
|
+
doc_x *= -1
|
|
402
|
+
|
|
403
|
+
if doc_y[1] < 0:
|
|
404
|
+
doc_y *= -1
|
|
405
|
+
|
|
406
|
+
# NOTE: these are in document coordinates
|
|
407
|
+
if orientation == "bottom":
|
|
408
|
+
perp_direction = doc_y
|
|
409
|
+
elif orientation == "top":
|
|
410
|
+
perp_direction = -doc_y
|
|
411
|
+
elif orientation == "left":
|
|
412
|
+
perp_direction = -doc_x
|
|
413
|
+
elif orientation == "right":
|
|
414
|
+
perp_direction = doc_x
|
|
415
|
+
|
|
416
|
+
perp_direction = np.array(perp_direction, dtype=np.float32)
|
|
417
|
+
perp_direction /= np.linalg.norm(perp_direction)
|
|
418
|
+
|
|
419
|
+
# rotate axes by -90 degrees to mimic label's rotation
|
|
420
|
+
if orientation in ["left", "right"]:
|
|
421
|
+
x = perp_direction[0]
|
|
422
|
+
y = perp_direction[1]
|
|
423
|
+
|
|
424
|
+
perp_direction[0] = -y
|
|
425
|
+
perp_direction[1] = x
|
|
426
|
+
|
|
427
|
+
# use the document (pixel) coord system to set text anchors
|
|
428
|
+
anchors = []
|
|
429
|
+
if perp_direction[0] < 0:
|
|
430
|
+
anchors.append('right')
|
|
431
|
+
elif perp_direction[0] > 0:
|
|
432
|
+
anchors.append('left')
|
|
433
|
+
else:
|
|
434
|
+
anchors.append('center')
|
|
435
|
+
if perp_direction[1] < 0:
|
|
436
|
+
anchors.append('bottom')
|
|
437
|
+
elif perp_direction[1] > 0:
|
|
438
|
+
anchors.append('top')
|
|
439
|
+
else:
|
|
440
|
+
anchors.append('middle')
|
|
441
|
+
|
|
442
|
+
return anchors
|
|
443
|
+
|
|
444
|
+
@staticmethod
|
|
445
|
+
def _get_ticks_anchors(center, halfdim, orientation, transforms):
|
|
446
|
+
visual_to_doc = transforms.get_transform('visual', 'document')
|
|
447
|
+
|
|
448
|
+
doc_x = visual_to_doc.map(np.array([1, 0, 0, 0], dtype=np.float32))
|
|
449
|
+
doc_y = visual_to_doc.map(np.array([0, 1, 0, 0], dtype=np.float32))
|
|
450
|
+
|
|
451
|
+
if doc_x[0] < 0:
|
|
452
|
+
doc_x *= -1
|
|
453
|
+
|
|
454
|
+
if doc_y[1] < 0:
|
|
455
|
+
doc_y *= -1
|
|
456
|
+
|
|
457
|
+
# NOTE: these are in document coordinates
|
|
458
|
+
if orientation == "bottom":
|
|
459
|
+
perp_direction = doc_y
|
|
460
|
+
elif orientation == "top":
|
|
461
|
+
perp_direction = -doc_y
|
|
462
|
+
elif orientation == "left":
|
|
463
|
+
perp_direction = -doc_x
|
|
464
|
+
elif orientation == "right":
|
|
465
|
+
perp_direction = doc_x
|
|
466
|
+
|
|
467
|
+
perp_direction = np.array(perp_direction, dtype=np.float32)
|
|
468
|
+
perp_direction /= np.linalg.norm(perp_direction)
|
|
469
|
+
|
|
470
|
+
# use the document (pixel) coord system to set text anchors
|
|
471
|
+
anchors = []
|
|
472
|
+
if perp_direction[0] < 0:
|
|
473
|
+
anchors.append('right')
|
|
474
|
+
elif perp_direction[0] > 0:
|
|
475
|
+
anchors.append('left')
|
|
476
|
+
else:
|
|
477
|
+
anchors.append('center')
|
|
478
|
+
if perp_direction[1] < 0:
|
|
479
|
+
anchors.append('bottom')
|
|
480
|
+
elif perp_direction[1] > 0:
|
|
481
|
+
anchors.append('top')
|
|
482
|
+
else:
|
|
483
|
+
anchors.append('middle')
|
|
484
|
+
|
|
485
|
+
return anchors
|
|
486
|
+
|
|
487
|
+
@staticmethod
|
|
488
|
+
def _calc_positions(center, halfdim, border_width,
|
|
489
|
+
orientation, transforms):
|
|
490
|
+
"""
|
|
491
|
+
Calculate the text centeritions given the ColorBar
|
|
492
|
+
parameters.
|
|
493
|
+
|
|
494
|
+
Note
|
|
495
|
+
----
|
|
496
|
+
This is static because in principle, this
|
|
497
|
+
function does not need access to the state of the ColorBar
|
|
498
|
+
at all. It's a computation function that computes coordinate
|
|
499
|
+
transforms
|
|
500
|
+
|
|
501
|
+
Parameters
|
|
502
|
+
----------
|
|
503
|
+
center: tuple (x, y)
|
|
504
|
+
Center of the ColorBar
|
|
505
|
+
halfdim: tuple (halfw, halfh)
|
|
506
|
+
Half of the dimensions measured from the center
|
|
507
|
+
border_width: float
|
|
508
|
+
Width of the border of the ColorBar
|
|
509
|
+
orientation: "top" | "bottom" | "left" | "right"
|
|
510
|
+
Position of the label with respect to the ColorBar
|
|
511
|
+
transforms: TransformSystem
|
|
512
|
+
the transforms of the ColorBar
|
|
513
|
+
"""
|
|
514
|
+
(x, y) = center
|
|
515
|
+
(halfw, halfh) = halfdim
|
|
516
|
+
|
|
517
|
+
visual_to_doc = transforms.get_transform('visual', 'document')
|
|
518
|
+
doc_to_visual = transforms.get_transform('document', 'visual')
|
|
519
|
+
|
|
520
|
+
# doc_widths = visual_to_doc.map(np.array([halfw, halfh, 0, 0],
|
|
521
|
+
# dtype=np.float32))
|
|
522
|
+
|
|
523
|
+
doc_x = visual_to_doc.map(np.array([halfw, 0, 0, 0], dtype=np.float32))
|
|
524
|
+
doc_y = visual_to_doc.map(np.array([0, halfh, 0, 0], dtype=np.float32))
|
|
525
|
+
|
|
526
|
+
if doc_x[0] < 0:
|
|
527
|
+
doc_x *= -1
|
|
528
|
+
|
|
529
|
+
if doc_y[1] < 0:
|
|
530
|
+
doc_y *= -1
|
|
531
|
+
|
|
532
|
+
# doc_halfw = np.abs(doc_widths[0])
|
|
533
|
+
# doc_halfh = np.abs(doc_widths[1])
|
|
534
|
+
|
|
535
|
+
if orientation == "top":
|
|
536
|
+
doc_perp_vector = -doc_y
|
|
537
|
+
elif orientation == "bottom":
|
|
538
|
+
doc_perp_vector = doc_y
|
|
539
|
+
elif orientation == "left":
|
|
540
|
+
doc_perp_vector = -doc_x
|
|
541
|
+
if orientation == "right":
|
|
542
|
+
doc_perp_vector = doc_x
|
|
543
|
+
|
|
544
|
+
perp_len = np.linalg.norm(doc_perp_vector)
|
|
545
|
+
doc_perp_vector /= perp_len
|
|
546
|
+
perp_len += border_width
|
|
547
|
+
perp_len += 5 # pixels
|
|
548
|
+
perp_len *= ColorBarVisual.text_padding_factor
|
|
549
|
+
doc_perp_vector *= perp_len
|
|
550
|
+
|
|
551
|
+
doc_center = visual_to_doc.map(np.array([x, y, 0, 0],
|
|
552
|
+
dtype=np.float32))
|
|
553
|
+
doc_label_pos = doc_center + doc_perp_vector
|
|
554
|
+
visual_label_pos = doc_to_visual.map(doc_label_pos)[:3]
|
|
555
|
+
|
|
556
|
+
# next, calculate tick positions
|
|
557
|
+
if orientation in ["top", "bottom"]:
|
|
558
|
+
doc_ticks_pos = [doc_label_pos - doc_x,
|
|
559
|
+
doc_label_pos + doc_x]
|
|
560
|
+
else:
|
|
561
|
+
doc_ticks_pos = [doc_label_pos + doc_y,
|
|
562
|
+
doc_label_pos - doc_y]
|
|
563
|
+
|
|
564
|
+
visual_ticks_pos = []
|
|
565
|
+
visual_ticks_pos.append(doc_to_visual.map(doc_ticks_pos[0])[:3])
|
|
566
|
+
visual_ticks_pos.append(doc_to_visual.map(doc_ticks_pos[1])[:3])
|
|
567
|
+
|
|
568
|
+
return (visual_label_pos, visual_ticks_pos)
|
|
569
|
+
|
|
570
|
+
@property
|
|
571
|
+
def pos(self):
|
|
572
|
+
"""The position of the text anchor in the local coordinate frame"""
|
|
573
|
+
return self._pos
|
|
574
|
+
|
|
575
|
+
@pos.setter
|
|
576
|
+
def pos(self, pos):
|
|
577
|
+
self._pos = pos
|
|
578
|
+
self._update_positions()
|
|
579
|
+
|
|
580
|
+
@property
|
|
581
|
+
def cmap(self):
|
|
582
|
+
"""The colormap of the Colorbar"""
|
|
583
|
+
return self._colorbar._cmap
|
|
584
|
+
|
|
585
|
+
@cmap.setter
|
|
586
|
+
def cmap(self, cmap):
|
|
587
|
+
self._colorbar.cmap = cmap
|
|
588
|
+
|
|
589
|
+
@property
|
|
590
|
+
def clim(self):
|
|
591
|
+
"""The data limits of the Colorbar
|
|
592
|
+
|
|
593
|
+
Returns
|
|
594
|
+
-------
|
|
595
|
+
clim: tuple(min, max)
|
|
596
|
+
"""
|
|
597
|
+
return self._clim
|
|
598
|
+
|
|
599
|
+
@clim.setter
|
|
600
|
+
def clim(self, clim):
|
|
601
|
+
self._clim = clim
|
|
602
|
+
self._update()
|
|
603
|
+
|
|
604
|
+
@property
|
|
605
|
+
def label(self):
|
|
606
|
+
"""The vispy.visuals.TextVisual associated with the label"""
|
|
607
|
+
return self._label
|
|
608
|
+
|
|
609
|
+
@label.setter
|
|
610
|
+
def label(self, label):
|
|
611
|
+
if isinstance(label, TextVisual):
|
|
612
|
+
self._label = label
|
|
613
|
+
else:
|
|
614
|
+
self._label.text = label
|
|
615
|
+
self._update()
|
|
616
|
+
|
|
617
|
+
@property
|
|
618
|
+
def ticks(self):
|
|
619
|
+
"""The vispy.visuals.TextVisual associated with the ticks
|
|
620
|
+
|
|
621
|
+
Returns
|
|
622
|
+
-------
|
|
623
|
+
ticks: [vispy.visual.TextVisual]
|
|
624
|
+
The array is of length 2
|
|
625
|
+
"""
|
|
626
|
+
return self._ticks
|
|
627
|
+
|
|
628
|
+
@ticks.setter
|
|
629
|
+
def ticks(self, ticks):
|
|
630
|
+
self._ticks = ticks
|
|
631
|
+
self._update()
|
|
632
|
+
|
|
633
|
+
@property
|
|
634
|
+
def border_width(self):
|
|
635
|
+
"""The width of the border around the ColorBar in pixels"""
|
|
636
|
+
return self._border.border_width
|
|
637
|
+
|
|
638
|
+
@border_width.setter
|
|
639
|
+
def border_width(self, border_width):
|
|
640
|
+
self._border.border_width = border_width
|
|
641
|
+
self._update()
|
|
642
|
+
|
|
643
|
+
@property
|
|
644
|
+
def border_color(self):
|
|
645
|
+
"""The color of the border around the ColorBar in pixels"""
|
|
646
|
+
return self._border.border_color
|
|
647
|
+
|
|
648
|
+
@border_color.setter
|
|
649
|
+
def border_color(self, border_color):
|
|
650
|
+
self._border.border_color = border_color
|
|
651
|
+
self._update()
|
|
652
|
+
|
|
653
|
+
@property
|
|
654
|
+
def orientation(self):
|
|
655
|
+
"""The orientation of the ColorBar"""
|
|
656
|
+
return self._orientation
|
|
657
|
+
|
|
658
|
+
@property
|
|
659
|
+
def size(self):
|
|
660
|
+
"""The size of the ColorBar
|
|
661
|
+
|
|
662
|
+
Returns
|
|
663
|
+
-------
|
|
664
|
+
size: (major_axis_length, minor_axis_length)
|
|
665
|
+
major and minor axis are defined by the
|
|
666
|
+
orientation of the ColorBar
|
|
667
|
+
"""
|
|
668
|
+
(halfw, halfh) = self._halfdim
|
|
669
|
+
if self.orientation in ["top", "bottom"]:
|
|
670
|
+
return (halfw * 2., halfh * 2.)
|
|
671
|
+
else:
|
|
672
|
+
return (halfh * 2., halfw * 2.)
|
|
673
|
+
|
|
674
|
+
@size.setter
|
|
675
|
+
def size(self, size):
|
|
676
|
+
if size[0] < size[1]:
|
|
677
|
+
raise ValueError("Major axis must be greater than or equal to "
|
|
678
|
+
"Minor axis. Given "
|
|
679
|
+
"Major axis: (%s) < Minor axis (%s)" % (size[0],
|
|
680
|
+
size[1]))
|
|
681
|
+
|
|
682
|
+
if self.orientation in ["top", "bottom"]:
|
|
683
|
+
(width, height) = size
|
|
684
|
+
else:
|
|
685
|
+
(height, width) = size
|
|
686
|
+
|
|
687
|
+
if width < 0.:
|
|
688
|
+
raise ValueError("width must be non-negative, not %s " % (width, ))
|
|
689
|
+
elif width == 0.:
|
|
690
|
+
raise ValueError("width must be non-zero, not %s" % (width, ))
|
|
691
|
+
|
|
692
|
+
if height < 0.:
|
|
693
|
+
raise ValueError("height must be non-negative, not %s " %
|
|
694
|
+
(height, ))
|
|
695
|
+
elif height == 0.:
|
|
696
|
+
raise ValueError("height must be non-zero, not %s" % (height, ))
|
|
697
|
+
|
|
698
|
+
self._halfdim = (width / 2., height / 2.)
|
|
699
|
+
self._update()
|