10000 GitHub - fossasia/visdom: A flexible tool for creating, organizing, and sharing visualizations of live, rich data. Supports Torch and Numpy.
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

A flexible tool for creating, organizing, and sharing visualizations of live, rich data. Supports Torch and Numpy.

License

Notifications You must be signed in to change notification settings

fossasia/visdom

{"props":{"initialPayload":{"allShortcutsEnabled":false,"path":"/","repo":{"id":80041090,"defaultBranch":"master","name":"visdom","ownerLogin":"fossasia","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2017-01-25T17:59:45.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/6295529?v=4","public":true,"private":false,"isOrgOwned":true},"currentUser":null,"refInfo":{"name":"master","listCacheKey":"v0:1697712963.0","canEdit":false,"refType":"branch","currentOid":"79c0360264eef8b784ea43a34d482efe124411db"},"tree":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"cypress","path":"cypress","contentType":"directory"},{"name":"example","path":"example","contentType":"directory"},{"name":"js","path":"js","contentType":"directory"},{"name":"py/visdom","path":"py/visdom","contentType":"directory","hasSimplifiedPath":true},{"name":"th","path":"th","contentType":"directory"},{"name":".babelrc","path":".babelrc","contentType":"file"},{"name":".eslintrc","path":".eslintrc","contentType":"file"},{"name":".gitattributes","path":".gitattributes","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".pre-commit-config.yaml","path":".pre-commit-config.yaml","contentType":"file"},{"name":".prettierignore","path":".prettierignore","contentType":"file"},{"name":".prettierrc","path":".prettierrc","contentType":"file"},{"name":"AUTHORS","path":"AUTHORS","contentType":"file"},{"name":"CODE_OF_CONDUCT.md","path":"CODE_OF_CONDUCT.md","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"MANIFEST.in","path":"MANIFEST.in","contentType":"file"},{"name":"PULL_REQUEST_TEMPLATE.md","path":"PULL_REQUEST_TEMPLATE.md","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"cypress.json","path":"cypress.json","contentType":"file"},{"name":"download.sh","path":"download.sh","contentType":"file"},{"name":"package.json","path":"package.json","contentType":"file"},{"name":"setup.py","path":"setup.py","contentType":"file"},{"name":"test-requirements.txt","path":"test-requirements.txt","contentType":"file"},{"name":"webpack.common.js","path":"webpack.common.js","contentType":"file"},{"name":"webpack.dev.js","path":"webpack.dev.js","contentType":"file"},{"name":"webpack.prod.js","path":"webpack.prod.js","contentType":"file"},{"name":"yarn.lock","path":"yarn.lock","contentType":"file"}],"templateDirectorySuggestionUrl":null,"readme":null,"totalCount":29,"showBranchInfobar":false},"fileTree":null,"fileTreeProcessingTime":null,"foldersToFetch":[],"treeExpanded":false,"symbolsExpanded":false,"isOverview":true,"overview":{"banners":{"shouldRecommendReadme":false,"isPersonalRepo":false,"showUseActionBanner":false,"actionSlug":null,"actionId":null,"showProtectBranchBanner":false,"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_repo","releasePath":"/fossasia/visdom/releases/new?marketplace=true","showPublishActionBanner":false},"interactionLimitBanner":null,"showInvitationBanner":false,"inviterName":null,"actionsMigrationBannerInfo":{"releaseTags":[],"showImmutableActionsMigrationBanner":false,"initialMigrationStatus":null}},"codeButton":{"contactPath":"/contact","isEnterprise":false,"local":{"protocolInfo":{"httpAvailable":true,"sshAvailable":null,"httpUrl":"https://github.com/fossasia/visdom.git","showCloneWarning":null,"sshUrl":null,"sshCertificatesRequired":null,"sshCertificatesAvailable":null,"ghCliUrl":"gh repo clone fossasia/visdom","defaultProtocol":"http","newSshKeyUrl":"/settings/ssh/new","setProtocolPath":"/users/set_protocol"},"platformInfo":{"cloneUrl":"https://desktop.github.com","showVisualStudioCloneButton":false,"visualStudioCloneUrl":"https://windows.github.com","showXcodeCloneButton":false,"xcodeCloneUrl":"xcode://clone?repo=https%3A%2F%2Fgithub.com%2Ffossasia%2Fvisdom","zipballUrl":"/fossasia/visdom/archive/refs/heads/master.zip"}},"newCodespacePath":"/codespaces/new?hide_repo_select=true\u0026repo=80041090"},"popovers":{"rename":null,"renamedParentRepo":null},"commitCount":"619","overviewFiles":[{"displayName":"README.md","repoName":"visdom","refName":"master","path":"README.md","preferredFileType":"readme","tabName":"README","richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 align=\"center\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\n \u003cbr\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198746195-574bb828-026f-41cb-82a9-250fcbc4e090.png\"\u003e\u003cimg src=\"https://user-images.githubusercontent.com/19650074/198746195-574bb828-026f-41cb-82a9-250fcbc4e090.png\" width=\"300\" alt=\"Logo\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003cbr\u003e\u003cbr\u003e\n Creating, organizing \u0026amp; sharing visualizations of live, rich data. Supports \u003ca href=\"https://pypi.org/project/visdom/\" rel=\"nofollow\"\u003ePython\u003c/a\u003e.\n\u003c/h3\u003e\u003ca id=\"user-content-------------creating-organizing--sharing-visualizations-of-live-rich-data-supports-python\" class=\"anchor\" aria-label=\"Permalink: \n Creating, organizing \u0026amp; sharing visualizations of live, rich data. Supports Python.\n\" href=\"#------------creating-organizing--sharing-visualizations-of-live-rich-data-supports-python\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e Jump To: \u003ca href=\"#setup\"\u003eSetup\u003c/a\u003e, \u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e, \u003ca href=\"#api\"\u003eAPI\u003c/a\u003e, \u003ca href=\"#customizing-visdom\"\u003eCustomizing\u003c/a\u003e, \u003ca href=\"#contributing\"\u003eContributing\u003c/a\u003e, \u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n \u003ca href=\"https://github.com/fossasia/visdom/releases\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/f880647ca86ead27544e16b60f27144e0f41d8efe2ebe5cfeeaacc6a6811d0cb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f666f7373617369612f766973646f6d3f636f6c6f72413d33363361346626636f6c6f72423d613664613935267374796c653d666f722d7468652d6261646765\" data-canonical-src=\"https://img.shields.io/github/v/release/fossasia/visdom?colorA=363a4f\u0026amp;colorB=a6da95\u0026amp;style=for-the-badge\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003ca href=\"https://pypi.org/project/visdom\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/240db7012dbb63b84993aac06d27431fa06495fc384e9f012a6b36ea8aa1d609/68747470733a2f2f696d672e736869656c64732e696f2f707970692f64642f766973646f6d3f636f6c6f72413d33363361346626636f6c6f72423d313536646631267374796c653d666f722d7468652d6261646765\" data-canonical-src=\"https://img.shields.io/pypi/dd/visdom?colorA=363a4f\u0026amp;colorB=156df1\u0026amp;style=for-the-badge\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003ca href=\"https://github.com/fossasia/visdom/commits\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/d8392d04909d18280b9efa796bf27d1255fe9bfbd39c3ea563052e23fb2a9152/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f666f7373617369612f766973646f6d3f636f6c6f72413d33363361346626636f6c6f72423d303039396666267374796c653d666f722d7468652d6261646765\" data-canonical-src=\"https://img.shields.io/github/commit-activity/m/fossasia/visdom?colorA=363a4f\u0026amp;colorB=0099ff\u0026amp;style=for-the-badge\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003ca href=\"https://github.com/fossasia/visdom/contributors\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/214d2c1043e26efabdddaca29bd780254fa0a69eb9fcad62e1b91995311bce4e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f666f7373617369612f766973646f6d3f636f6c6f72413d33363361346626636f6c6f72423d363062396634267374796c653d666f722d7468652d6261646765\" data-canonical-src=\"https://img.shields.io/github/contributors/fossasia/visdom?colorA=363a4f\u0026amp;colorB=60b9f4\u0026amp;style=for-the-badge\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\nVisdom aims to facilitate visualization of (remote) data with an emphasis on supporting scientific experimentation.\u003cbr\u003e\nBroadcast visualizations of plots, images, and text for yourself and your collaborators.\nOrganize your visualization space programmatically or through the UI to create dashboards for live data, inspect results of experiments, or debug experimental code.\n\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198747904-7a8a580f-851a-45fb-8f45-94e54a910ee2.png\"\u003e\u003cimg src=\"https://user-images.githubusercontent.com/19650074/198747904-7a8a580f-851a-45fb-8f45-94e54a910ee2.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198748177-c973f387-c392-4f6e-9e3d-27dfe578eb59.gif\"\u003e\u003cimg width=\"49.5%\" src=\"https://user-images.githubusercontent.com/19650074/198748177-c973f387-c392-4f6e-9e3d-27dfe578eb59.gif\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198748189-917091b6-95c4-4415-b965-ba3e7e81e1f8.png\"\u003e\u003cimg width=\"49.5%\" src=\"https://user-images.githubusercontent.com/19650074/198748189-917091b6-95c4-4415-b965-ba3e7e81e1f8.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eConcepts\u003c/h2\u003e\u003ca id=\"user-content-concepts\" class=\"anchor\" aria-label=\"Permalink: Concepts\" href=\"#concepts\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eVisdom has a simple set of features that can be composed for various use-cases.\u003c/p\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eWindows\u003c/b\u003e\u003c/summary\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198821065-6666cb22-d34a-4839-ae19-f6f6a4a1bae4.png\"\u003e\u003cimg width=\"500\" align=\"center\" src=\"https://user-images.githubusercontent.com/19650074/198821065-6666cb22-d34a-4839-ae19-f6f6a4a1bae4.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe UI begins as a blank slate – you can populate it with plots, images, and text. These appear in windows that you can drag, drop, resize, and destroy. The windows live in \u003ccode\u003eenvs\u003c/code\u003e and the state of \u003ccode\u003eenvs\u003c/code\u003e is stored across sessions. You can download the content of windows – including your plots in \u003ccode\u003esvg\u003c/code\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eTip\u003c/strong\u003e: You can use the zoom of your browser to adjust the scale of the UI.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eCallbacks\u003c/b\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eThe python Visdom implementation supports callbacks on a window. The demo shows an example of this in the form of an editable text pad. The functionality of these callbacks allows the Visdom object to receive and react to events that happen in the frontend.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou can subscribe a window to events by adding a function to the event handlers dict for the window id you want to subscribe by calling \u003ccode\u003eviz.register_event_handler(handler, win_id)\u003c/code\u003e with your handler and the window id. Multiple handlers can be registered to the same window. You can remove all event handlers from a window using \u003ccode\u003eviz.clear_event_handlers(win_id)\u003c/code\u003e. When an event occurs to that window, your callbacks will be called on a dict containing:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eevent_type\u003c/code\u003e: one of the below event types\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epane_data\u003c/code\u003e: all of the stored contents for that window including layout and content.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eeid\u003c/code\u003e: the current environment id\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etarget\u003c/code\u003e: the window id the event is called on\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eAdditional parameters are defined below.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eRight now the following callback events are supported:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eClose\u003c/code\u003e - Triggers when a window is closed. Returns a dict with only the aforementioned fields.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eKeyPress\u003c/code\u003e - Triggers when a key is pressed. Contains additional parameters:\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003ekey\u003c/code\u003e - A string representation of the key pressed (applying state modifiers such as SHIFT)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ekey_code\u003c/code\u003e - The javascript event keycode for the pressed key (no modifiers)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ePropertyUpdate\u003c/code\u003e - Triggers when a property is updated in Property pane\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003epropertyId\u003c/code\u003e - Position in properties list\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evalue\u003c/code\u003e - New property value\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eClick\u003c/code\u003e - Triggers when Image pane is clicked on, has a parameter:\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eimage_coord\u003c/code\u003e - dictionary with the fields \u003ccode\u003ex\u003c/code\u003e and \u003ccode\u003ey\u003c/code\u003e for the click coordinates in the coordinate frame of the possibly zoomed/panned image (\u003cem\u003enot\u003c/em\u003e the enclosing pane).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eEditable Plot Parameters\u003c/b\u003e\u003c/summary\u003e\nUse the top-right *edit*-Button to inspect all parameters used for plot in the respective window. \nThe visdom client supports dynamic change of plot parameters as well. Just change one of the listed parameters, the plot will be altered on-the-fly. \nClick the button again to close the property list.\n\u003cp align=\"center\" dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/156751970-0915757d-8bf0-4a6d-a510-1d34a918e47a.gif\"\u003e\u003cimg align=\"center\" src=\"https://user-images.githubusercontent.com/19650074/156751970-0915757d-8bf0-4a6d-a510-1d34a918e47a.gif\" width=\"400\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eEnvironments\u003c/b\u003e\u003c/summary\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198821281-ea1cea1a-66c3-495e-be52-cd0f1a3300f7.png\"\u003e\u003cimg align=\"center\" src=\"https://user-images.githubusercontent.com/19650074/198821281-ea1cea1a-66c3-495e-be52-cd0f1a3300f7.png\" width=\"300\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou can partition your visualization space with \u003ccode\u003eenvs\u003c/code\u003e. By default, every user will have an env called \u003ccode\u003emain\u003c/code\u003e. New envs can be created in the UI or programmatically. The state of envs is chronically saved. Environments are able to keep entirely different pools of plots.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou can access a specific env via url: \u003ccode\u003ehttp://localhost.com:8097/env/main\u003c/code\u003e. If your server is hosted, you can share this url so others can see your visualizations too.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eEnvironments are automatically hierarchically organized by the first \u003ccode\u003e_\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSelecting Environments\u003c/h4\u003e\u003ca id=\"user-content-selecting-environments\" class=\"anchor\" aria-label=\"Permalink: Selecting Environments\" href=\"#selecting-environments\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198821299-6602d557-7a02-4b9f-b1d5-d57615cdc15c.png\"\u003e\u003cimg align=\"center\" src=\"https://user-images.githubusercontent.com/19650074/198821299-6602d557-7a02-4b9f-b1d5-d57615cdc15c.png\" width=\"300\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFrom the main page it is possible to toggle between different environments using the environment selector. Selecting a new environment will query the server for the plots that exist in that environment. The environment selector allows for searching and filtering for the new enironment.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eComparing Environments\u003c/h4\u003e\u003ca id=\"user-content-comparing-environments\" class=\"anchor\" aria-label=\"Permalink: Comparing Environments\" href=\"#comparing-environments\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFrom the main page it is possible to compare different environments using the environment selector. Selecting multiple environments in the check box will query the server for the plots with the same titles in all environments and plot them in a single plot. An additional compare legend pane is created with a number corresponding to each selected environment. Individual plots are updated with legends corresponding to \"x_name\" where \u003ccode\u003ex\u003c/code\u003e is a number corresponding with the compare legend pane and \u003ccode\u003ename\u003c/code\u003e is the original name in the legend.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e: The compare envs view is not robust to high throughput data, as the server is responsible for generating the compared content. Do not compare an environment that is receiving a high quantity of updates on any plot, as every update will request regenerating the comparison. If you need to compare two plots that are receiving high quantities of data, have them share the same window on a singular env.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eClearing Environments\u003c/h4\u003e\u003ca id=\"user-content-clearing-environments\" class=\"anchor\" aria-label=\"Permalink: Clearing Environments\" href=\"#clearing-environments\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can use the eraser button to remove all of the current contents of an environment. This closes the plot windows for that environment but keeps the empty environment for new plots.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eManaging Environments\u003c/h4\u003e\u003ca id=\"user-content-managing-environments\" class=\"anchor\" aria-label=\"Permalink: Managing Environments\" href=\"#managing-environments\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198821309-4c6449fd-978a-462a-aa35-e59d872b61bd.png\"\u003e\u003cimg align=\"center\" src=\"https://user-images.githubusercontent.com/19650074/198821309-4c6449fd-978a-462a-aa35-e59d872b61bd.png\" width=\"400\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003ePressing the folder icon opens a dialog that allows you to fork or force save the current environment, or delete any of your existing environments. Use of this feature is fully described in the \u003cstrong\u003eState\u003c/strong\u003e section.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eEnv Files:\u003c/strong\u003e\nYour envs are loaded upon request by the user, by default from \u003ccode\u003e$HOME/.visdom/\u003c/code\u003e. Custom paths can be passed as a cmd-line argument. Envs are removed by using the delete button or by deleting the corresponding \u003ccode\u003e.json\u003c/code\u003e file from the env dir. In case you want the server to pre-load all files into cache, use the flag \u003ccode\u003e-eager_data_loading\u003c/code\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eState\u003c/b\u003e\u003c/summary\u003e\n\u003cp dir=\"auto\"\u003eOnce you've created a few visualizations, state is maintained. The server automatically caches your visualizations -- if you reload the page, your visualizations reappear.\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198821344-cb8c424e-455c-4249-b3b4-5554309a5ec7.gif\"\u003e\u003cimg align=\"center\" src=\"https://user-images.githubusercontent.com/19650074/198821344-cb8c424e-455c-4249-b3b4-5554309a5ec7.gif\" width=\"400\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eSave:\u003c/strong\u003e You can manually do so with the \u003ccode\u003esave\u003c/code\u003e button. This will serialize the env's state (to disk, in JSON), including window positions. You can save an \u003ccode\u003eenv\u003c/code\u003e programmatically.\n\u003cbr\u003eThis is helpful for more sophisticated visualizations in which configuration is meaningful, e.g. a data-rich demo, a model training dashboard, or systematic experimentation. This also makes them easy to share and reuse.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eFork:\u003c/strong\u003e If you enter a new env name, saving will create a new env -- effectively \u003cstrong\u003eforking\u003c/strong\u003e the previous env.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eTip\u003c/strong\u003e: Fork an environment before you begin to make edits to ensure that your changes are saved seperately.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFilter\u003c/h3\u003e\u003ca id=\"user-content-filter\" class=\"anchor\" aria-label=\"Permalink: Filter\" href=\"#filter\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can use the \u003ccode\u003efilter\u003c/code\u003e to dynamically sift through windows present in an env -- just provide a regular expression with which to match titles of window you want to show. This can be helpful in use cases involving an env with many windows e.g. when systematically checking experimental results.\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198821379-eeebd8a2-bcab-407a-b47f-9b2d0290c23e.png\"\u003e\u003cimg align=\"center\" src=\"https://user-images.githubusercontent.com/19650074/198821379-eeebd8a2-bcab-407a-b47f-9b2d0290c23e.png\" width=\"300\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e: If you have saved your current view, the view will be restored after clearing the filter.\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198821402-4702611e-1038-4093-8cd5-9c8120444211.gif\"\u003e\u003cimg align=\"center\" src=\"https://user-images.githubusercontent.com/19650074/198821402-4702611e-1038-4093-8cd5-9c8120444211.gif\" width=\"500\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eViews\u003c/h3\u003e\u003ca id=\"user-content-views\" class=\"anchor\" aria-label=\"Permalink: Views\" href=\"#views\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198821420-458c863b-c304-4d10-8906-0cc2f0c20241.png\"\u003e\u003cimg align=\"center\" src=\"https://user-images.githubusercontent.com/19650074/198821420-458c863b-c304-4d10-8906-0cc2f0c20241.png\" width=\"300\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIt is possible to manage the views simply by dragging the tops of windows around, however additional features exist to keep views organized and save common views. View management can be useful for saving and switching between multiple common organizations of your windows.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSaving/Deleting Views\u003c/h4\u003e\u003ca id=\"user-content-savingdeleting-views\" class=\"anchor\" aria-label=\"Permalink: Saving/Deleting Views\" href=\"#savingdeleting-views\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 10000 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUsing the folder icon, a dialog window opens where views can be forked in the same way that envs can be. Saving a view will retain the position and sizes of all of the windows in a given environment. Views are saved in \u003ccode\u003e$HOME/.visdom/view/layouts.json\u003c/code\u003e in the visdom filepath.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e: Saved views are static, and editing a saved view copies that view over to the \u003ccode\u003ecurrent\u003c/code\u003e view where editing can occur.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRe-Packing\u003c/h4\u003e\u003ca id=\"user-content-re-packing\" class=\"anchor\" aria-label=\"Permalink: Re-Packing\" href=\"#re-packing\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUsing the repack icon (9 boxes), visdom will attempt to pack your windows in a way that they best fit while retaining row/column ordering.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e: Due to the reliance on row/column ordering and \u003ccode\u003eReactGridLayout\u003c/code\u003e the final layout might be slightly different than what might be expected. We're working on improving that experience or providing alternatives that give more fine-tuned control.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eReloading Views\u003c/h4\u003e\u003ca id=\"user-content-reloading-views\" class=\"anchor\" aria-label=\"Permalink: Reloading Views\" href=\"#reloading-views\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198821436-6c7957b5-dd67-4afc-9fc3-4bf074137022.gif\"\u003e\u003cimg align=\"center\" src=\"https://user-images.githubusercontent.com/19650074/198821436-6c7957b5-dd67-4afc-9fc3-4bf074137022.gif\" width=\"600\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUsing the view dropdown it is possible to select previously saved views, restoring the locations and sizes of all of the windows within the current environment to the places they were when that view was saved last.\u003c/p\u003e\n\u003c/details\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSetup\u003c/h2\u003e\u003ca id=\"user-content-setup\" class=\"anchor\" aria-label=\"Permalink: Setup\" href=\"#setup\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ePython and web clients come bundled with the python server.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eInstall from pip\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt; pip install visdom\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e pip install visdom\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eInstall from source\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt; pip install git+https://github.com/fossasia/visdom\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e pip install git+https://github.com/fossasia/visdom\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUsage\u003c/h2\u003e\u003ca id=\"user-content-usage\" class=\"anchor\" aria-label=\"Permalink: Usage\" href=\"#usage\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eStart the server (probably in a \u003ccode\u003escreen\u003c/code\u003e or \u003ccode\u003etmux\u003c/code\u003e) from the command line:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt; visdom\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e visdom\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eVisdom now can be accessed by going to \u003ccode\u003ehttp://localhost:8097\u003c/code\u003e in your browser, or your own host address if specified.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003evisdom\u003c/code\u003e command is equivalent to running \u003ccode\u003epython -m visdom.server\u003c/code\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eIf the above does not work, try using an SSH tunnel to your server by adding the following line to your local \u003ccode\u003e~/.ssh/config\u003c/code\u003e:\n\u003ccode\u003eLocalForward 127.0.0.1:8097 127.0.0.1:8097\u003c/code\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCommand Line Options\u003c/h4\u003e\u003ca id=\"user-content-command-line-options\" class=\"anchor\" aria-label=\"Permalink: Command Line Options\" href=\"#command-line-options\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe following options can be provided to the server:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003e-port\u003c/code\u003e : The port to run the server on.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-hostname\u003c/code\u003e : The hostname to run the server on.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-base_url\u003c/code\u003e : The base server url (default = /).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-env_path\u003c/code\u003e : The path to the serialized session to reload.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-logging_level\u003c/code\u003e : Logging level (default = INFO). Accepts both standard text and numeric logging values.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-readonly\u003c/code\u003e : Flag to start server in readonly mode.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-enable_login\u003c/code\u003e : Flag to setup authentication for the sever, requiring a username and password to login.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-force_new_cookie\u003c/code\u003e : Flag to reset the secure cookie used by the server, invalidating current login cookies.\nRequires \u003ccode\u003e-enable_login\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-bind_local\u003c/code\u003e : Flag to make the server accessible only from localhost.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-eager_data_loading\u003c/code\u003e : By default visdom loads environments lazily upon user request. Setting this flag lets visdom pre-fetch all environments upon startup.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eWhen \u003ccode\u003e-enable_login\u003c/code\u003e flag is provided, the server asks user to input credentials using terminal prompt. Alternatively,\nyou can setup \u003ccode\u003eVISDOM_USE_ENV_CREDENTIALS\u003c/code\u003e env variable, and then provide your username and password via\n\u003ccode\u003eVISDOM_USERNAME\u003c/code\u003e and \u003ccode\u003eVISDOM_PASSWORD\u003c/code\u003e env variables without manually interacting with the terminal. This setup\nis useful in case if you would like to launch \u003ccode\u003evisdom\u003c/code\u003e server from bash script, or from Jupyter notebook.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"VISDOM_USERNAME=username\nVISDOM_PASSWORD=password\nVISDOM_USE_ENV_CREDENTIALS=1 visdom -enable_login\"\u003e\u003cpre\u003eVISDOM_USERNAME=username\nVISDOM_PASSWORD=password\nVISDOM_USE_ENV_CREDENTIALS=1 visdom -enable_login\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can also use \u003ccode\u003eVISDOM_COOKIE\u003c/code\u003e variable to provide cookies value if the cookie file wasn't generated, or the\nflag \u003ccode\u003e-force_new_cookie\u003c/code\u003e was set.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePython example\u003c/h4\u003e\u003ca id=\"user-content-python-example\" class=\"anchor\" aria-label=\"Permalink: Python example\" href=\"#python-example\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"import visdom\nimport numpy as np\nvis = visdom.Visdom()\nvis.text('Hello, world!')\nvis.image(np.ones((3, 10, 10)))\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eimport\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evisdom\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eimport\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003enumpy\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eas\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003enp\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003evis\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evisdom\u003c/span\u003e.\u003cspan class=\"pl-c1\"\u003eVisdom\u003c/span\u003e()\n\u003cspan class=\"pl-s1\"\u003evis\u003c/span\u003e.\u003cspan class=\"pl-c1\"\u003etext\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e'Hello, world!'\u003c/span\u003e)\n\u003cspan class=\"pl-s1\"\u003evis\u003c/span\u003e.\u003cspan class=\"pl-c1\"\u003eimage\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003enp\u003c/span\u003e.\u003cspan class=\"pl-c1\"\u003eones\u003c/span\u003e((\u003cspan class=\"pl-c1\"\u003e3\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e10\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e10\u003c/span\u003e)))\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDemos\u003c/h3\u003e\u003ca id=\"user-content-demos\" class=\"anchor\" aria-label=\"Permalink: Demos\" href=\"#demos\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you have cloned this repository, you can run our demo showcase.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"python example/demo.py\"\u003e\u003cpre\u003epython example/demo.py\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAPI\u003c/h2\u003e\u003ca id=\"user-content-api\" class=\"anchor\" aria-label=\"Permalink: API\" href=\"#api\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor a quick introduction into the capabilities of \u003ccode\u003evisdom\u003c/code\u003e, have a look at the \u003ccode\u003eexample\u003c/code\u003e directory, or read the details below.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eVisdom Arguments (Python only)\u003c/h3\u003e\u003ca id=\"user-content-visdom-arguments-python-only\" class=\"anchor\" aria-label=\"Permalink: Visdom Arguments (Python only)\" href=\"#visdom-arguments-python-only\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe python visdom client takes a few options:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eserver\u003c/code\u003e: the hostname of your visdom server (default: \u003ccode\u003e'http://localhost'\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eport\u003c/code\u003e: the port for your visdom server (default: \u003ccode\u003e8097\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ebase_url\u003c/code\u003e: the base visdom server url (default: \u003ccode\u003e/\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eenv\u003c/code\u003e: Default environment to plot to when no \u003ccode\u003eenv\u003c/code\u003e is provided (default: \u003ccode\u003emain\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eraise_exceptions\u003c/code\u003e: Raise exceptions upon failure rather than printing them (default: \u003ccode\u003eTrue\u003c/code\u003e (soon))\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elog_to_filename\u003c/code\u003e: If not none, log all plotting and updating events to the given file (append mode) so that they can be replayed later using \u003ccode\u003ereplay_log\u003c/code\u003e (default: \u003ccode\u003eNone\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003euse_incoming_socket\u003c/code\u003e: enable use of the socket for receiving events from the web client, allowing user to register callbacks (default: \u003ccode\u003eTrue\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehttp_proxy_host\u003c/code\u003e: Deprecated. Use Proxies argument for complete proxy support.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehttp_proxy_port\u003c/code\u003e: Deprecated. Use Proxies argument for complete proxy support.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eusername\u003c/code\u003e: username to use for authentication, if server started with \u003ccode\u003e-enable_login\u003c/code\u003e (default: \u003ccode\u003eNone\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epassword\u003c/code\u003e: password to use for authentication, if server started with \u003ccode\u003e-enable_login\u003c/code\u003e (default: \u003ccode\u003eNone\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eproxies\u003c/code\u003e: Dictionary mapping protocol to the URL of the proxy (e.g. {\u003ccode\u003ehttp\u003c/code\u003e: \u003ccode\u003efoo.bar:3128\u003c/code\u003e}) to be used on each Request. (default: \u003ccode\u003eNone\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eoffline\u003c/code\u003e: Flag to run visdom in offline mode, where all requests are logged to file rather than to the server. Requires \u003ccode\u003elog_to_filename\u003c/code\u003e is set. In offline mode, all visdom commands that don't create or update plots will simply return \u003ccode\u003eTrue\u003c/code\u003e. (default: \u003ccode\u003eFalse\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eOther options are either currently unused (endpoint, ipv6) or used for internal functionality.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBasics\u003c/h3\u003e\u003ca id=\"user-content-basics\" class=\"anchor\" aria-label=\"Permalink: Basics\" href=\"#basics\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eVisdom offers the following basic visualization functions:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#visimage\"\u003e\u003ccode\u003evis.image\u003c/code\u003e\u003c/a\u003e : image\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visimages\"\u003e\u003ccode\u003evis.images\u003c/code\u003e\u003c/a\u003e : list of images\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#vistext\"\u003e\u003ccode\u003evis.text\u003c/code\u003e\u003c/a\u003e : arbitrary HTML\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visproperties\"\u003e\u003ccode\u003evis.properties\u003c/code\u003e\u003c/a\u003e : properties grid\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visaudio\"\u003e\u003ccode\u003evis.audio\u003c/code\u003e\u003c/a\u003e : audio\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visvideo\"\u003e\u003ccode\u003evis.video\u003c/code\u003e\u003c/a\u003e : videos\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#vissvg\"\u003e\u003ccode\u003evis.svg\u003c/code\u003e\u003c/a\u003e : SVG object\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#vismatplot\"\u003e\u003ccode\u003evis.matplot\u003c/code\u003e\u003c/a\u003e : matplotlib plot\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#vissave\"\u003e\u003ccode\u003evis.save\u003c/code\u003e\u003c/a\u003e : serialize state server-side\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePlotting\u003c/h3\u003e\u003ca id=\"user-content-plotting\" class=\"anchor\" aria-label=\"Permalink: Plotting\" href=\"#plotting\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWe have wrapped several common plot types to make creating basic visualizations easily. These visualizations are powered by \u003ca href=\"https://plot.ly/\" rel=\"nofollow\"\u003ePlotly\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following API is currently supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#visscatter\"\u003e\u003ccode\u003evis.scatter\u003c/code\u003e\u003c/a\u003e : 2D or 3D scatter plots\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visline\"\u003e\u003ccode\u003evis.line\u003c/code\u003e\u003c/a\u003e : line plots\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visstem\"\u003e\u003ccode\u003evis.stem\u003c/code\u003e\u003c/a\u003e : stem plots\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visheatmap\"\u003e\u003ccode\u003evis.heatmap\u003c/code\u003e\u003c/a\u003e : heatmap plots\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visbar\"\u003e\u003ccode\u003evis.bar\u003c/code\u003e\u003c/a\u003e : bar graphs\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#vishistogram\"\u003e\u003ccode\u003evis.histogram\u003c/code\u003e\u003c/a\u003e : histograms\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visboxplot\"\u003e\u003ccode\u003evis.boxplot\u003c/code\u003e\u003c/a\u003e : boxplots\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#vissurf\"\u003e\u003ccode\u003evis.surf\u003c/code\u003e\u003c/a\u003e : surface plots\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#viscontour\"\u003e\u003ccode\u003evis.contour\u003c/code\u003e\u003c/a\u003e : contour plots\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visquiver\"\u003e\u003ccode\u003evis.quiver\u003c/code\u003e\u003c/a\u003e : quiver plots\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#vismesh\"\u003e\u003ccode\u003evis.mesh\u003c/code\u003e\u003c/a\u003e : mesh plots\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visdual_axis_lines\"\u003e\u003ccode\u003evis.dual_axis_lines\u003c/code\u003e\u003c/a\u003e : double y axis line plots\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eGeneric Plots\u003c/h3\u003e\u003ca id=\"user-content-generic-plots\" class=\"anchor\" aria-label=\"Permalink: Generic Plots\" href=\"#generic-plots\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNote that the server API adheres to the Plotly convention of \u003ccode\u003edata\u003c/code\u003e and \u003ccode\u003elayout\u003c/code\u003e objects, such that you can produce your own arbitrary \u003ccode\u003ePlotly\u003c/code\u003e visualizations:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"import visdom\nvis = visdom.Visdom()\n\ntrace = dict(x=[1, 2, 3], y=[4, 5, 6], mode=\u0026quot;markers+lines\u0026quot;, type='custom',\n marker={'color': 'red', 'symbol': 104, 'size': \u0026quot;10\u0026quot;},\n text=[\u0026quot;one\u0026quot;, \u0026quot;two\u0026quot;, \u0026quot;three\u0026quot;], name='1st Trace')\nlayout = dict(title=\u0026quot;First Plot\u0026quot;, xaxis={'title': 'x1'}, yaxis={'title': 'x2'})\n\nvis._send({'data': [trace], 'layout': layout, 'win': 'mywin'})\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eimport\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evisdom\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003evis\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evisdom\u003c/span\u003e.\u003cspan class=\"pl-c1\"\u003eVisdom\u003c/span\u003e()\n\n\u003cspan class=\"pl-s1\"\u003etrace\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003edict\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003ex\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e3\u003c/span\u003e], \u003cspan class=\"pl-s1\"\u003ey\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e4\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e5\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e6\u003c/span\u003e], \u003cspan class=\"pl-s1\"\u003emode\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"markers+lines\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003etype\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e'custom'\u003c/span\u003e,\n \u003cspan class=\"pl-s1\"\u003emarker\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e{\u003cspan class=\"pl-s\"\u003e'color'\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'red'\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'symbol'\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e104\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'size'\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\"10\"\u003c/span\u003e},\n \u003cspan class=\"pl-s1\"\u003etext\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e[\u003cspan class=\"pl-s\"\u003e\"one\"\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e\"two\"\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e\"three\"\u003c/span\u003e], \u003cspan class=\"pl-s1\"\u003ename\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e'1st Trace'\u003c/span\u003e)\n\u003cspan class=\"pl-s1\"\u003elayout\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003edict\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003etitle\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"First Plot\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003exaxis\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e{\u003cspan class=\"pl-s\"\u003e'title'\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'x1'\u003c/span\u003e}, \u003cspan class=\"pl-s1\"\u003eyaxis\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e{\u003cspan class=\"pl-s\"\u003e'title'\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'x2'\u003c/span\u003e})\n\n\u003cspan class=\"pl-s1\"\u003evis\u003c/span\u003e.\u003cspan class=\"pl-c1\"\u003e_send\u003c/span\u003e({\u003cspan class=\"pl-s\"\u003e'data'\u003c/span\u003e: [\u003cspan class=\"pl-s1\"\u003etrace\u003c/span\u003e], \u003cspan class=\"pl-s\"\u003e'layout'\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003elayout\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'win'\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e'mywin'\u003c/span\u003e})\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOthers\u003c/h3\u003e\u003ca id=\"user-content-others\" class=\"anchor\" aria-label=\"Permalink: Others\" href=\"#others\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#visclose\"\u003e\u003ccode\u003evis.close\u003c/code\u003e\u003c/a\u003e : close a window by id\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visdelete_env\"\u003e\u003ccode\u003evis.delete_env\u003c/code\u003e\u003c/a\u003e : delete an environment by env_id\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#viswin_exists\"\u003e\u003ccode\u003evis.win_exists\u003c/code\u003e\u003c/a\u003e : check if a window already exists by id\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visget_env_list\"\u003e\u003ccode\u003evis.get_env_list\u003c/code\u003e\u003c/a\u003e : get a list of all of the environments on your server\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visget_window_data\"\u003e\u003ccode\u003evis.get_window_data\u003c/code\u003e\u003c/a\u003e: get current data for a window\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#vischeck_connection\"\u003e\u003ccode\u003evis.check_connection\u003c/code\u003e\u003c/a\u003e: check if the server is connected\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visreplay_log\"\u003e\u003ccode\u003evis.replay_log\u003c/code\u003e\u003c/a\u003e: replay the actions from the provided log file\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDetails\u003c/h2\u003e\u003ca id=\"user-content-details\" class=\"anchor\" aria-label=\"Permalink: Details\" href=\"#details\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198747904-7a8a580f-851a-45fb-8f45-94e54a910ee2.png\"\u003e\u003cimg src=\"https://user-images.githubusercontent.com/19650074/198747904-7a8a580f-851a-45fb-8f45-94e54a910ee2.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBasics\u003c/h3\u003e\u003ca id=\"user-content-basics-1\" class=\"anchor\" aria-label=\"Permalink: Basics\" href=\"#basics-1\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.image\u003c/h4\u003e\u003ca id=\"user-content-visimage\" class=\"anchor\" aria-label=\"Permalink: vis.image\" href=\"#visimage\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws an \u003ccode\u003eimg\u003c/code\u003e. It takes as input an \u003ccode\u003eCxHxW\u003c/code\u003e tensor \u003ccode\u003eimg\u003c/code\u003e\nthat contains the image.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following \u003ccode\u003eopts\u003c/code\u003e are supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003ejpgquality\u003c/code\u003e: JPG quality (\u003ccode\u003enumber\u003c/code\u003e 0-100). If defined image will be saved as JPG to reduce file size. If not defined image will be saved as PNG.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecaption\u003c/code\u003e: Caption for the image\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estore_history\u003c/code\u003e: Keep all images stored to the same window and attach a slider to the bottom that will let you select the image to view. You must always provide this opt when sending new images to an image with history.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e You can use alt on an image pane to view the x/y coordinates of the cursor. You can also ctrl-scroll to zoom, alt scroll to pan vertically, and alt-shift scroll to pan horizontally. Double click inside the pane to restore the image to default.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.images\u003c/h4\u003e\u003ca id=\"user-content-visimages\" class=\"anchor\" aria-label=\"Permalink: vis.images\" href=\"#visimages\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a list of \u003ccode\u003eimages\u003c/code\u003e. It takes an input \u003ccode\u003eB x C x H x W\u003c/code\u003e tensor or a \u003ccode\u003elist of images\u003c/code\u003e all of the same size. It makes a grid of images of size (B / nrow, nrow).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following arguments and \u003ccode\u003eopts\u003c/code\u003e are supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003enrow\u003c/code\u003e: Number of images in a row\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epadding\u003c/code\u003e: Padding around the image, equal padding around all 4 sides\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.jpgquality\u003c/code\u003e: JPG quality (\u003ccode\u003enumber\u003c/code\u003e 0-100). If defined image will be saved as JPG to reduce file size. If not defined image will be saved as PNG.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.caption\u003c/code\u003e: Caption for the image\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.text\u003c/h4\u003e\u003ca id=\"user-content-vistext\" class=\"anchor\" aria-label=\"Permalink: vis.text\" href=\"#vistext\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function prints text in a box. You can use this to embed arbitrary HTML.\nIt takes as input a \u003ccode\u003etext\u003c/code\u003e string.\nNo specific \u003ccode\u003eopts\u003c/code\u003e are currently supported.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.properties\u003c/h4\u003e\u003ca id=\"user-content-visproperties\" class=\"anchor\" aria-label=\"Permalink: vis.properties\" href=\"#visproperties\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function shows editable properties in a pane. Properties are expected to be a List of Dicts e.g.:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\" properties = [\n {'type': 'text', 'name': 'Text input', 'value': 'initial'},\n {'type': 'number', 'name': 'Number input', 'value': '12'},\n {'type': 'button', 'name': 'Button', 'value': 'Start'},\n {'type': 'checkbox', 'name': 'Checkbox', 'value': True},\n {'type': 'select', 'name': 'Select', 'value': 1, 'values': ['Red', 'Green', 'Blue']},\n ]\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e properties = [\n {'type': 'text', 'name': 'Text input', 'value': 'initial'},\n {'type': 'number', 'name': 'Number input', 'value': '12'},\n {'type': 'button', 'name': 'Button', 'value': 'Start'},\n {'type': 'checkbox', 'name': 'Checkbox', 'value': True},\n {'type': 'select', 'name': 'Select', 'value': 1, 'values': ['Red', 'Green', 'Blue']},\n ]\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSupported types:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003etext: string\u003c/li\u003e\n\u003cli\u003enumber: decimal number\u003c/li\u003e\n\u003cli\u003ebutton: button labeled with \"value\"\u003c/li\u003e\n\u003cli\u003echeckbox: boolean value rendered as a checkbox\u003c/li\u003e\n\u003cli\u003eselect: multiple values select box\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003evalue\u003c/code\u003e: id of selected value (zero based)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evalues\u003c/code\u003e: list of possible values\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eCallback are called on property value update:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eevent_type\u003c/code\u003e: \u003ccode\u003e\"PropertyUpdate\"\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epropertyId\u003c/code\u003e: position in the \u003ccode\u003eproperties\u003c/code\u003e list\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evalue\u003c/code\u003e: new value\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eNo specific \u003ccode\u003eopts\u003c/code\u003e are currently supported.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.audio\u003c/h4\u003e\u003ca id=\"user-content-visaudio\" class=\"anchor\" aria-label=\"Permalink: vis.audio\" href=\"#visaudio\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function plays audio. It takes as input the filename of the audio\nfile or an \u003ccode\u003eN\u003c/code\u003e tensor containing the waveform (use an \u003ccode\u003eNx2\u003c/code\u003e matrix for stereo\naudio). The function does not support any plot-specific \u003ccode\u003eopts\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following \u003ccode\u003eopts\u003c/code\u003e are supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.sample_frequency\u003c/code\u003e: sample frequency (\u003ccode\u003einteger\u003c/code\u003e \u0026gt; 0; default = 44100)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eKnown issue: Visdom uses scipy to convert tensor inputs to wave files. Some\nversions of Chrome are known not to play these wave files (Firefox and Safari work fine).\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.video\u003c/h4\u003e\u003ca id=\"user-content-visvideo\" class=\"anchor\" aria-label=\"Permalink: vis.video\" href=\"#visvideo\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function plays a video. It takes as input the filename of the video\n\u003ccode\u003evideofile\u003c/code\u003e or a \u003ccode\u003eLxHxWxC\u003c/code\u003e-sized\n\u003ccode\u003etensor\u003c/code\u003e containing all the frames of the video as input. The\nfunction does not support any plot-specific \u003ccode\u003eopts\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following \u003ccode\u003eopts\u003c/code\u003e are supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.fps\u003c/code\u003e: FPS for the video (\u003ccode\u003einteger\u003c/code\u003e \u0026gt; 0; default = 25)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eNote: Using \u003ccode\u003etensor\u003c/code\u003e input requires that ffmpeg is installed and working.\nYour ability to play video may depend on the browser you use: your browser has\nto support the Theano codec in an OGG container (Chrome supports this).\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.svg\u003c/h4\u003e\u003ca id=\"user-content-vissvg\" class=\"anchor\" aria-label=\"Permalink: vis.svg\" href=\"#vissvg\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws an SVG object. It takes as input a SVG string \u003ccode\u003esvgstr\u003c/code\u003e or\nthe name of an SVG file \u003ccode\u003esvgfile\u003c/code\u003e. The function does not support any specific\n\u003ccode\u003eopts\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.matplot\u003c/h4\u003e\u003ca id=\"user-content-vismatplot\" class=\"anchor\" aria-label=\"Permalink: vis.matplot\" href=\"#vismatplot\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a Matplotlib \u003ccode\u003eplot\u003c/code\u003e. The function supports\none plot-specific option: \u003ccode\u003eresizable\u003c/code\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e When set to \u003ccode\u003eTrue\u003c/code\u003e the plot is resized with the\npane. You need \u003ccode\u003ebeautifulsoup4\u003c/code\u003e and \u003ccode\u003elxml\u003c/code\u003e\npackages installed to use this option.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e: \u003ccode\u003ematplot\u003c/code\u003e is not rendered using the same backend as plotly plots, and is somewhat less efficient. Using too many matplot windows may degrade visdom performance.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.plotlyplot\u003c/h4\u003e\u003ca id=\"user-content-visplotlyplot\" class=\"anchor\" aria-label=\"Permalink: vis.plotlyplot\" href=\"#visplotlyplot\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a Plotly \u003ccode\u003eFigure\u003c/code\u003e object. It does not explicitly take options as it assumes you have already explicitly configured the figure's \u003ccode\u003elayout\u003c/code\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e You must have the \u003ccode\u003eplotly\u003c/code\u003e Python package installed to use this function. It can typically be installed by running \u003ccode\u003epip install plotly\u003c/code\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.embeddings\u003c/h4\u003e\u003ca id=\"user-content-visembeddings\" class=\"anchor\" aria-label=\"Permalink: vis.embeddings\" href=\"#visembeddings\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function visualizes a collection of features using the \u003ca href=\"https://github.com/lvdmaaten/bhtsne\"\u003eBarnes-Hut t-SNE algorithm\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe function accepts the following arguments:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003efeatures\u003c/code\u003e: a list of tensors\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elabels\u003c/code\u003e: a list of corresponding labels for the tensors provided for \u003ccode\u003efeatures\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edata_getter=fn\u003c/code\u003e: (optional) a function that takes as a parameter an index into the features array and returns a summary representation of the tensor. If this is set, \u003ccode\u003edata_type\u003c/code\u003e must also be set.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edata_type=str\u003c/code\u003e: (optional) currently the only acceptable value here is \u003ccode\u003e\"html\"\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eWe currently assume that there are no more than 10 unique labels, in the future we hope to provide a colormap in opts for other cases.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFrom the UI you can also draw a lasso around a subset of features. This will rerun the t-SNE visualization on the selected subset.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.save\u003c/h4\u003e\u003ca id=\"user-content-vissave\" class=\"anchor\" aria-label=\"Permalink: vis.save\" href=\"#vissave\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function saves the \u003ccode\u003eenvs\u003c/code\u003e that are alive on the visdom server. It takes input a list of env ids to be saved.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePlotting\u003c/h3\u003e\u003ca id=\"user-content-plotting-1\" class=\"anchor\" aria-label=\"Permalink: Plotting\" href=\"#plotting-1\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFurther details on the wrapped plotting functions are given below.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe exact inputs into the plotting functions vary, although most of them take as input a tensor \u003ccode\u003eX\u003c/code\u003e than contains the data and an (optional) tensor \u003ccode\u003eY\u003c/code\u003e that contains optional data variables (such as labels or timestamps). All plotting functions take as input an optional \u003ccode\u003ewin\u003c/code\u003e that can be used to plot into a specific window; each plotting function also returns the \u003ccode\u003ewin\u003c/code\u003e of the window it plotted in. One can also specify the \u003ccode\u003eenv\u003c/code\u003e to which the visualization should be added.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.scatter\u003c/h4\u003e\u003ca id=\"user-content-visscatter\" class=\"anchor\" aria-label=\"Permalink: vis.scatter\" href=\"#visscatter\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a 2D or 3D scatter plot. It takes as input an \u003ccode\u003eNx2\u003c/code\u003e or\n\u003ccode\u003eNx3\u003c/code\u003e tensor \u003ccode\u003eX\u003c/code\u003e that specifies the locations of the \u003ccode\u003eN\u003c/code\u003e points in the\nscatter plot. An optional \u003ccode\u003eN\u003c/code\u003e tensor \u003ccode\u003eY\u003c/code\u003e containing discrete labels that\nrange between \u003ccode\u003e1\u003c/code\u003e and \u003ccode\u003eK\u003c/code\u003e can be specified as well -- the labels will be\nreflected in the colors of the markers.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eupdate\u003c/code\u003e can be used to efficiently update the data of an existing plot. Use \u003ccode\u003e'append'\u003c/code\u003e to append data, \u003ccode\u003e'replace'\u003c/code\u003e to use new data, or \u003ccode\u003e'remove'\u003c/code\u003e to remove the trace specified by \u003ccode\u003ename\u003c/code\u003e.\nUsing \u003ccode\u003eupdate='append'\u003c/code\u003e will create a plot if it doesn't exist and append to the existing plot otherwise.\nIf updating a single trace, use \u003ccode\u003ename\u003c/code\u003e to specify the name of the trace to be updated. Update data that is all NaN is ignored (can be used for masking update).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following \u003ccode\u003eopts\u003c/code\u003e are supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.markersymbol\u003c/code\u003e : marker symbol (\u003ccode\u003estring\u003c/code\u003e; default = \u003ccode\u003e'dot'\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.markersize\u003c/code\u003e : marker size (\u003ccode\u003enumber\u003c/code\u003e; default = \u003ccode\u003e'10'\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.markercolor\u003c/code\u003e : color per marker. (\u003ccode\u003etorch.*Tensor\u003c/code\u003e; default = \u003ccode\u003enil\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.markerborderwidth\u003c/code\u003e: marker border line width (\u003ccode\u003efloat\u003c/code\u003e; default = 0.5)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.legend\u003c/code\u003e : \u003ccode\u003etable\u003c/code\u003e containing legend names\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.textlabels\u003c/code\u003e : text label for each point (\u003ccode\u003elist\u003c/code\u003e: default = \u003ccode\u003eNone\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.layoutopts\u003c/code\u003e : dict of any additional options that the graph backend accepts for a layout. For example \u003ccode\u003elayoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.traceopts\u003c/code\u003e : dict mapping trace names or indices to dicts of additional options that the graph backend accepts. For example \u003ccode\u003etraceopts = {'plotly': {'myTrace': {'mode': 'markers'}}}\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.webgl\u003c/code\u003e : use WebGL for plotting (\u003ccode\u003eboolean\u003c/code\u003e; default = \u003ccode\u003efalse\u003c/code\u003e). It is faster if a plot contains too many points. Use sparingly as browsers won't allow more than a couple of WebGL contexts on a single page.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eopts.markercolor\u003c/code\u003e is a Tensor with Integer values. The tensor can be of size \u003ccode\u003eN\u003c/code\u003e or \u003ccode\u003eN x 3\u003c/code\u003e or \u003ccode\u003eK\u003c/code\u003e or \u003ccode\u003eK x 3\u003c/code\u003e.\u003c/p\u003e\n\u003cul dir=\"au 10000 to\"\u003e\n\u003cli\u003eTensor of size \u003ccode\u003eN\u003c/code\u003e: Single intensity value per data point. 0 = black, 255 = red\u003c/li\u003e\n\u003cli\u003eTensor of size \u003ccode\u003eN x 3\u003c/code\u003e: Red, Green and Blue intensities per data point. 0,0,0 = black, 255,255,255 = white\u003c/li\u003e\n\u003cli\u003eTensor of size \u003ccode\u003eK\u003c/code\u003e and \u003ccode\u003eK x 3\u003c/code\u003e: Instead of having a unique color per data point, the same color is shared for all points of a particular label.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.sunburst\u003c/h4\u003e\u003ca id=\"user-content-vissunburst\" class=\"anchor\" aria-label=\"Permalink: vis.sunburst\" href=\"#vissunburst\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a sunburst chart. It takes two inputs: \u003ccode\u003eparents\u003c/code\u003e and \u003ccode\u003elabels\u003c/code\u003e array.\nvalues from \u003ccode\u003eparents\u003c/code\u003e array is used as parents object, like it define above which sector\nshould the this sector shown. values from \u003ccode\u003elabels\u003c/code\u003e array is used to define sector's label\nor you can say name. keep in mind that lenght of array \u003ccode\u003eparents\u003c/code\u003e and \u003ccode\u003elabels\u003c/code\u003e should be\nequal. There is a third array that you can pass to which is \u003ccode\u003evalue\u003c/code\u003e, it is use to show\na value on hovering over a sector, it is optional argument, but if you are passing it then\nkeep in mind lenght of \u003ccode\u003evalues\u003c/code\u003e should be equal to \u003ccode\u003eparents\u003c/code\u003e or \u003ccode\u003elabels\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFollowing \u003ccode\u003eopts\u003c/code\u003e are currently supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.font_size\u003c/code\u003e : define font size of label (\u003ccode\u003eint\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.font_color\u003c/code\u003e : define font color of label (\u003ccode\u003estring\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.opacity\u003c/code\u003e : define opacity of chart (\u003ccode\u003efloat\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.line_width\u003c/code\u003e : define distance between two sectors and sector to its parents (\u003ccode\u003eint\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.line\u003c/h4\u003e\u003ca id=\"user-content-visline\" class=\"anchor\" aria-label=\"Permalink: vis.line\" href=\"#visline\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a line plot. It takes as input an \u003ccode\u003eN\u003c/code\u003e or \u003ccode\u003eNxM\u003c/code\u003e tensor\n\u003ccode\u003eY\u003c/code\u003e that specifies the values of the \u003ccode\u003eM\u003c/code\u003e lines (that connect \u003ccode\u003eN\u003c/code\u003e points)\nto plot. It also takes an optional \u003ccode\u003eX\u003c/code\u003e tensor that specifies the\ncorresponding x-axis values; \u003ccode\u003eX\u003c/code\u003e can be an \u003ccode\u003eN\u003c/code\u003e tensor (in which case all\nlines will share the same x-axis values) or have the same size as \u003ccode\u003eY\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eupdate\u003c/code\u003e can be used to efficiently update the data of an existing plot. Use 'append' to append data, 'replace' to use new data, or 'remove' to remove the trace specified by \u003ccode\u003ename\u003c/code\u003e. If updating a single trace, use \u003ccode\u003ename\u003c/code\u003e to specify the name of the trace to be updated. Update data that is all NaN is ignored (can be used for masking update).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eSmoothing\u003c/strong\u003e: Line plots can be smoothened using \u003ca href=\"https://en.wikipedia.org/wiki/Savitzky%E2%80%93Golay_filter\" rel=\"nofollow\"\u003eSavitzky-Golay filtering\u003c/a\u003e. This feature can be enabled by clicking the \u003ccode\u003e~\u003c/code\u003e-symbol in the top right corner of a window that contains a line plot.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/159366736-1f5d8099-0ea5-4a3b-af17-49d3e24cb32c.gif\"\u003e\u003cimg src=\"https://user-images.githubusercontent.com/19650074/159366736-1f5d8099-0ea5-4a3b-af17-49d3e24cb32c.gif\" alt=\"Demo of interactive smoothing.\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following \u003ccode\u003eopts\u003c/code\u003e are supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.fillarea\u003c/code\u003e : fill area below line (\u003ccode\u003eboolean\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.markers\u003c/code\u003e : show markers (\u003ccode\u003eboolean\u003c/code\u003e; default = \u003ccode\u003efalse\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.markersymbol\u003c/code\u003e: marker symbol (\u003ccode\u003estring\u003c/code\u003e; default = \u003ccode\u003e'dot'\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.markersize\u003c/code\u003e : marker size (\u003ccode\u003enumber\u003c/code\u003e; default = \u003ccode\u003e'10'\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.linecolor\u003c/code\u003e : line colors (\u003ccode\u003enp.array\u003c/code\u003e; default = None)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.dash\u003c/code\u003e : line dash type for each line (\u003ccode\u003enp.array\u003c/code\u003e; default = 'solid'), one of \u003ccode\u003esolid\u003c/code\u003e, \u003ccode\u003edash\u003c/code\u003e, \u003ccode\u003edashdot\u003c/code\u003e or \u003ccode\u003edash\u003c/code\u003e, size should match number of lines being drawn\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.legend\u003c/code\u003e : \u003ccode\u003etable\u003c/code\u003e containing legend names\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.layoutopts\u003c/code\u003e : \u003ccode\u003edict\u003c/code\u003e of any additional options that the graph backend accepts for a layout. For example \u003ccode\u003elayoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.traceopts\u003c/code\u003e : \u003ccode\u003edict\u003c/code\u003e mapping trace names or indices to \u003ccode\u003edict\u003c/code\u003es of additional options that plot.ly accepts for a trace.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.webgl\u003c/code\u003e : use WebGL for plotting (\u003ccode\u003eboolean\u003c/code\u003e; default = \u003ccode\u003efalse\u003c/code\u003e). It is faster if a plot contains too many points. Use sparingly as browsers won't allow more than a couple of WebGL contexts on a single page.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.stem\u003c/h4\u003e\u003ca id=\"user-content-visstem\" class=\"anchor\" aria-label=\"Permalink: vis.stem\" href=\"#visstem\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a stem plot. It takes as input an \u003ccode\u003eN\u003c/code\u003e or \u003ccode\u003eNxM\u003c/code\u003e tensor\n\u003ccode\u003eX\u003c/code\u003e that specifies the values of the \u003ccode\u003eN\u003c/code\u003e points in the \u003ccode\u003eM\u003c/code\u003e time series.\nAn optional \u003ccode\u003eN\u003c/code\u003e or \u003ccode\u003eNxM\u003c/code\u003e tensor \u003ccode\u003eY\u003c/code\u003e containing timestamps can be specified\nas well; if \u003ccode\u003eY\u003c/code\u003e is an \u003ccode\u003eN\u003c/code\u003e tensor then all \u003ccode\u003eM\u003c/code\u003e time series are assumed to\nhave the same timestamps.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following \u003ccode\u003eopts\u003c/code\u003e are supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.colormap\u003c/code\u003e: colormap (\u003ccode\u003estring\u003c/code\u003e; default = \u003ccode\u003e'Viridis'\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.legend\u003c/code\u003e : \u003ccode\u003etable\u003c/code\u003e containing legend names\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.layoutopts\u003c/code\u003e : \u003ccode\u003edict\u003c/code\u003e of any additional options that the graph backend accepts for a layout. For example \u003ccode\u003elayoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.heatmap\u003c/h4\u003e\u003ca id=\"user-content-visheatmap\" class=\"anchor\" aria-label=\"Permalink: vis.heatmap\" href=\"#visheatmap\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a heatmap. It takes as input an \u003ccode\u003eNxM\u003c/code\u003e tensor \u003ccode\u003eX\u003c/code\u003e that\nspecifies the value at each location in the heatmap.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eupdate\u003c/code\u003e can be used to efficiently update the data of an existing plot. Use 'appendRow' to append data row-wise, 'appendColumn' to append data column-wise, 'prependRow' to prepend data row-wise, 'prependColumn' to prepend data column-wise, 'replace' to use new data, or 'remove' to remove the plot specified by \u003ccode\u003ewin\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following \u003ccode\u003eopts\u003c/code\u003e are supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.colormap\u003c/code\u003e : colormap (\u003ccode\u003estring\u003c/code\u003e; default = \u003ccode\u003e'Viridis'\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xmin\u003c/code\u003e : clip minimum value (\u003ccode\u003enumber\u003c/code\u003e; default = \u003ccode\u003eX:min()\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xmax\u003c/code\u003e : clip maximum value (\u003ccode\u003enumber\u003c/code\u003e; default = \u003ccode\u003eX:max()\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.columnnames\u003c/code\u003e: \u003ccode\u003etable\u003c/code\u003e containing x-axis labels\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.rownames\u003c/code\u003e : \u003ccode\u003etable\u003c/code\u003e containing y-axis labels\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.layoutopts\u003c/code\u003e : \u003ccode\u003edict\u003c/code\u003e of any additional options that the graph backend accepts for a layout. For example \u003ccode\u003elayoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.nancolor\u003c/code\u003e : color for plotting \u003ccode\u003eNaN\u003c/code\u003es. If this is \u003ccode\u003eNone\u003c/code\u003e, \u003ccode\u003eNaN\u003c/code\u003es will be plotted as transparent. (\u003ccode\u003estring\u003c/code\u003e; default = \u003ccode\u003eNone\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.bar\u003c/h4\u003e\u003ca id=\"user-content-visbar\" class=\"anchor\" aria-label=\"Permalink: vis.bar\" href=\"#visbar\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a regular, stacked, or grouped bar plot. It takes as\ninput an \u003ccode\u003eN\u003c/code\u003e or \u003ccode\u003eNxM\u003c/code\u003e tensor \u003ccode\u003eX\u003c/code\u003e that specifies the height of each of the\nbars. If \u003ccode\u003eX\u003c/code\u003e contains \u003ccode\u003eM\u003c/code\u003e columns, the values corresponding to each row\nare either stacked or grouped (depending on how \u003ccode\u003eopts.stacked\u003c/code\u003e is\nset). In addition to \u003ccode\u003eX\u003c/code\u003e, an (optional) \u003ccode\u003eN\u003c/code\u003e tensor \u003ccode\u003eY\u003c/code\u003e can be specified\nthat contains the corresponding x-axis values.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following plot-specific \u003ccode\u003eopts\u003c/code\u003e are currently supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.rownames\u003c/code\u003e: \u003ccode\u003etable\u003c/code\u003e containing x-axis labels\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.stacked\u003c/code\u003e : stack multiple columns in \u003ccode\u003eX\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.legend\u003c/code\u003e : \u003ccode\u003etable\u003c/code\u003e containing legend labels\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.layoutopts\u003c/code\u003e : \u003ccode\u003edict\u003c/code\u003e of any additional options that the graph backend accepts for a layout. For example \u003ccode\u003elayoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.histogram\u003c/h4\u003e\u003ca id=\"user-content-vishistogram\" class=\"anchor\" aria-label=\"Permalink: vis.histogram\" href=\"#vishistogram\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a histogram of the specified data. It takes as input\nan \u003ccode\u003eN\u003c/code\u003e tensor \u003ccode\u003eX\u003c/code\u003e that specifies the data of which to construct the\nhistogram.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following plot-specific \u003ccode\u003eopts\u003c/code\u003e are currently supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.numbins\u003c/code\u003e: number of bins (\u003ccode\u003enumber\u003c/code\u003e; default = 30)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.layoutopts\u003c/code\u003e : \u003ccode\u003edict\u003c/code\u003e of any additional options that the graph backend accepts for a layout. For example \u003ccode\u003elayoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.boxplot\u003c/h4\u003e\u003ca id=\"user-content-visboxplot\" class=\"anchor\" aria-label=\"Permalink: vis.boxplot\" href=\"#visboxplot\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws boxplots of the specified data. It takes as input\nan \u003ccode\u003eN\u003c/code\u003e or an \u003ccode\u003eNxM\u003c/code\u003e tensor \u003ccode\u003eX\u003c/code\u003e that specifies the \u003ccode\u003eN\u003c/code\u003e data values of which\nto construct the \u003ccode\u003eM\u003c/code\u003e boxplots.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following plot-specific \u003ccode\u003eopts\u003c/code\u003e are currently supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.legend\u003c/code\u003e: labels for each of the columns in \u003ccode\u003eX\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.layoutopts\u003c/code\u003e : \u003ccode\u003edict\u003c/code\u003e of any additional options that the graph backend accepts for a layout. For example \u003ccode\u003elayoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.surf\u003c/h4\u003e\u003ca id=\"user-content-vissurf\" class=\"anchor\" aria-label=\"Permalink: vis.surf\" href=\"#vissurf\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a surface plot. It takes as input an \u003ccode\u003eNxM\u003c/code\u003e tensor \u003ccode\u003eX\u003c/code\u003e\nthat specifies the value at each location in the surface plot.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following \u003ccode\u003eopts\u003c/code\u003e are supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.colormap\u003c/code\u003e: colormap (\u003ccode\u003estring\u003c/code\u003e; default = \u003ccode\u003e'Viridis'\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xmin\u003c/code\u003e : clip minimum value (\u003ccode\u003enumber\u003c/code\u003e; default = \u003ccode\u003eX:min()\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xmax\u003c/code\u003e : clip maximum value (\u003ccode\u003enumber\u003c/code\u003e; default = \u003ccode\u003eX:max()\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.layoutopts\u003c/code\u003e : \u003ccode\u003edict\u003c/code\u003e of any additional options that the graph backend accepts for a layout. For example \u003ccode\u003elayoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.contour\u003c/h4\u003e\u003ca id=\"user-content-viscontour\" class=\"anchor\" aria-label=\"Permalink: vis.contour\" href=\"#viscontour\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a contour plot. It takes as input an \u003ccode\u003eNxM\u003c/code\u003e tensor \u003ccode\u003eX\u003c/code\u003e\nthat specifies the value at each location in the contour plot.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following \u003ccode\u003eopts\u003c/code\u003e are supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.colormap\u003c/code\u003e: colormap (\u003ccode\u003estring\u003c/code\u003e; default = \u003ccode\u003e'Viridis'\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xmin\u003c/code\u003e : clip minimum value (\u003ccode\u003enumber\u003c/code\u003e; default = \u003ccode\u003eX:min()\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xmax\u003c/code\u003e : clip maximum value (\u003ccode\u003enumber\u003c/code\u003e; default = \u003ccode\u003eX:max()\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.layoutopts\u003c/code\u003e : \u003ccode\u003edict\u003c/code\u003e of any additional options that the graph backend accepts for a layout. For example \u003ccode\u003elayoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.quiver\u003c/h4\u003e\u003ca id=\"user-content-visquiver\" class=\"anchor\" aria-label=\"Permalink: vis.quiver\" href=\"#visquiver\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a quiver plot in which the direction and length of the\narrows is determined by the \u003ccode\u003eNxM\u003c/code\u003e tensors \u003ccode\u003eX\u003c/code\u003e and \u003ccode\u003eY\u003c/code\u003e. Two optional \u003ccode\u003eNxM\u003c/code\u003e\ntensors \u003ccode\u003egridX\u003c/code\u003e and \u003ccode\u003egridY\u003c/code\u003e can be provided that specify the offsets of\nthe arrows; by default, the arrows will be done on a regular grid.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following \u003ccode\u003eopts\u003c/code\u003e are supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.normalize\u003c/code\u003e: length of longest arrows (\u003ccode\u003enumber\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.arrowheads\u003c/code\u003e: show arrow heads (\u003ccode\u003eboolean\u003c/code\u003e; default = \u003ccode\u003etrue\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.layoutopts\u003c/code\u003e : \u003ccode\u003edict\u003c/code\u003e of any additional options that the graph backend accepts for a layout. For example \u003ccode\u003elayoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.mesh\u003c/h4\u003e\u003ca id=\"user-content-vismesh\" class=\"anchor\" aria-label=\"Permalink: vis.mesh\" href=\"#vismesh\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a mesh plot from a set of vertices defined in an\n\u003ccode\u003eNx2\u003c/code\u003e or \u003ccode\u003eNx3\u003c/code\u003e matrix \u003ccode\u003eX\u003c/code\u003e, and polygons defined in an optional \u003ccode\u003eMx2\u003c/code\u003e or\n\u003ccode\u003eMx3\u003c/code\u003e matrix \u003ccode\u003eY\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following \u003ccode\u003eopts\u003c/code\u003e are supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.color\u003c/code\u003e: color (\u003ccode\u003estring\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.opacity\u003c/code\u003e: opacity of polygons (\u003ccode\u003enumber\u003c/code\u003e between 0 and 1)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.layoutopts\u003c/code\u003e : \u003ccode\u003edict\u003c/code\u003e of any additional options that the graph backend accepts for a layout. For example \u003ccode\u003elayoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.dual_axis_lines\u003c/h4\u003e\u003ca id=\"user-content-visdual_axis_lines\" class=\"anchor\" aria-label=\"Permalink: vis.dual_axis_lines\" href=\"#visdual_axis_lines\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function will create a line plot using plotly with different Y-Axis.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eX\u003c/code\u003e = A numpy array of the range.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eY1\u003c/code\u003e = A numpy array of the same count as \u003ccode\u003eX\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eY2\u003c/code\u003e = A numpy array of the same count as \u003ccode\u003eX\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following \u003ccode\u003eopts\u003c/code\u003e are supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.height\u003c/code\u003e : Height of the plot\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.width\u003c/code\u003e : Width of the plot\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.name_y1\u003c/code\u003e : Axis name for Y1 plot\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.name_y2\u003c/code\u003e : Axis name for Y2 plot\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.title\u003c/code\u003e : Title of the plot\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.color_title_y1\u003c/code\u003e : Color of the Y1 axis Title\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.color_tick_y1\u003c/code\u003e : Color of the Y1 axis Ticks\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.color_title_y2\u003c/code\u003e : Color of the Y2 axis Title\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.color_tick_y2\u003c/code\u003e : Color of the Y2 axis Ticks\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.side\u003c/code\u003e : side on which the Y2 tick has to be placed. Has values 'right' or \u003ccode\u003eleft\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.showlegend\u003c/code\u003e : Display legends (boolean values)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.top\u003c/code\u003e : Set the top margin of the plot\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.bottom\u003c/code\u003e : Set the bottom margin of the plot\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.right\u003c/code\u003e : Set the right margin of the plot\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.left\u003c/code\u003e : Set the left margin of the plot\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThis is the image of the output:\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/19650074/198822367-666cc42e-4354-4a7a-8dd3-d8ff143f885d.gif\"\u003e\u003cimg align=\"center\" src=\"https://user-images.githubusercontent.com/19650074/198822367-666cc42e-4354-4a7a-8dd3-d8ff143f885d.gif\" width=\"400\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNetwork Graph\u003c/h3\u003e\u003ca id=\"user-content-network-graph\" class=\"anchor\" aria-label=\"Permalink: Network Graph\" href=\"#network-graph\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function draws a graph, in which the nodes and edges are taken from a 2-D matrix of size [,2] where each row contains a source and destination node value. The numeric value used to define nodes should be strictly between (0 to n-1), where n is the number of nodes.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThere are two optional arguments :\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eedgeLabels\u003c/code\u003e : list of custom edge labels. If not provided each edge gets a label, \"source-destination\", eg \"1-2\", size should be equal to size of input \"edges\". Optional.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enodeLabels\u003c/code\u003e : list of custom node labels. If not provided each node gets a label same as the numeric value defined in the \"edges\". size should be equal to number of nodes present. Optional.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe following opts are supported:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.height\u003c/code\u003e : Height of the plot. Default : 500\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.width\u003c/code\u003e : Width of the plot. Default : 500\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.directed\u003c/code\u003e : whether the plot should have a arrow or not. Default : false\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.showVertexLabels\u003c/code\u003e : Whether to show vertex labels. Default : true\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.showEdgeLabels\u003c/code\u003e : Whether to show edge labels. Default : false\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.scheme\u003c/code\u003e : Whether all nodes shoud have \"same\" color or \"different\". Default : \"same\"\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCustomizing plots\u003c/h3\u003e\u003ca id=\"user-content-customizing-plots\" class=\"anchor\" aria-label=\"Permalink: Customizing plots\" href=\"#customizing-plots\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe plotting functions take an optional \u003ccode\u003eopts\u003c/code\u003e table as input that can be used to change (generic or plot-specific) properties of the plots.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAll input arguments are specified in a single table; the input arguments are matches based on the keys they have in the input table.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following \u003ccode\u003eopts\u003c/code\u003e are generic in the sense that they are the same for all visualizations (except \u003ccode\u003eplot.image\u003c/code\u003e, \u003ccode\u003eplot.text\u003c/code\u003e, \u003ccode\u003eplot.video\u003c/code\u003e, and \u003ccode\u003eplot.audio\u003c/code\u003e):\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eopts.title\u003c/code\u003e : figure title\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.width\u003c/code\u003e : figure width\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.height\u003c/code\u003e : figure height\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.showlegend\u003c/code\u003e : show legend (\u003ccode\u003etrue\u003c/code\u003e or \u003ccode\u003efalse\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xtype\u003c/code\u003e : type of x-axis (\u003ccode\u003e'linear'\u003c/code\u003e or \u003ccode\u003e'log'\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xlabel\u003c/code\u003e : label of x-axis\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xtick\u003c/code\u003e : show ticks on x-axis (\u003ccode\u003eboolean\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xtickmin\u003c/code\u003e : first tick on x-axis (\u003ccode\u003enumber\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xtickmax\u003c/code\u003e : last tick on x-axis (\u003ccode\u003enumber\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xtickvals\u003c/code\u003e : locations of ticks on x-axis (\u003ccode\u003etable\u003c/code\u003e of \u003ccode\u003enumber\u003c/code\u003es)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xticklabels\u003c/code\u003e : ticks labels on x-axis (\u003ccode\u003etable\u003c/code\u003e of \u003ccode\u003estring\u003c/code\u003es)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xtickstep\u003c/code\u003e : distances between ticks on x-axis (\u003ccode\u003enumber\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.xtickfont\u003c/code\u003e : font for x-axis labels (dict of \u003ca href=\"https://plot.ly/javascript/reference/#layout-font\" rel=\"nofollow\"\u003efont information\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.ytype\u003c/code\u003e : type of y-axis (\u003ccode\u003e'linear'\u003c/code\u003e or \u003ccode\u003e'log'\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.ylabel\u003c/code\u003e : label of y-axis\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.ytick\u003c/code\u003e : show ticks on y-axis (\u003ccode\u003eboolean\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.ytickmin\u003c/code\u003e : first tick on y-axis (\u003ccode\u003enumber\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.ytickmax\u003c/code\u003e : last tick on y-axis (\u003ccode\u003enumber\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.ytickvals\u003c/code\u003e : locations of ticks on y-axis (\u003ccode\u003etable\u003c/code\u003e of \u003ccode\u003enumber\u003c/code\u003es)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.yticklabels\u003c/code\u003e : ticks labels on y-axis (\u003ccode\u003etable\u003c/code\u003e of \u003ccode\u003estring\u003c/code\u003es)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.ytickstep\u003c/code\u003e : distances between ticks on y-axis (\u003ccode\u003enumber\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.ytickfont\u003c/code\u003e : font for y-axis labels (dict of \u003ca href=\"https://plot.ly/javascript/reference/#layout-font\" rel=\"nofollow\"\u003efont information\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.marginleft\u003c/code\u003e : left margin (in pixels)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.marginright\u003c/code\u003e : right margin (in pixels)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.margintop\u003c/code\u003e : top margin (in pixels)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopts.marginbottom\u003c/code\u003e: bottom margin (in pixels)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eopts\u003c/code\u003e are passed as dictionary in python scripts.You can pass \u003ccode\u003eopts\u003c/code\u003e like:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"opts=dict(title=\u0026quot;my title\u0026quot;, xlabel=\u0026quot;x axis\u0026quot;,ylabel=\u0026quot;y axis\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eopts=dict(title=\"my title\", xlabel=\"x axis\",ylabel=\"y axis\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOR\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"opts={\u0026quot;title\u0026quot;:\u0026quot;my title\u0026quot;, \u0026quot;xlabel\u0026quot;:\u0026quot;x axis\u0026quot;,\u0026quot;ylabel\u0026quot;:\u0026quot;y axis\u0026quot;}\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eopts={\"title\":\"my title\", \"xlabel\":\"x axis\",\"ylabel\":\"y axis\"}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe other options are visualization-specific, and are described in the\ndocumentation of the functions.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOthers\u003c/h3\u003e\u003ca id=\"user-content-others-1\" class=\"anchor\" aria-label=\"Permalink: Others\" href=\"#others-1\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.close\u003c/h4\u003e\u003ca id=\"user-content-visclose\" class=\"anchor\" aria-label=\"Permalink: vis.close\" href=\"#visclose\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function closes a specific window. It takes input window id \u003ccode\u003ewin\u003c/code\u003e and environment id \u003ccode\u003eeid\u003c/code\u003e. Use \u003ccode\u003ewin\u003c/code\u003e as \u003ccode\u003eNone\u003c/code\u003e to close all windows in an environment.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.delete_env\u003c/h4\u003e\u003ca id=\"user-content-visdelete_env\" class=\"anchor\" aria-label=\"Permalink: vis.delete_env\" href=\"#visdelete_env\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function deletes a specified env entirely. It takes env id \u003ccode\u003eeid\u003c/code\u003e as input.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e: \u003ccode\u003edelete_env\u003c/code\u003e is deletes all data for an environment and is IRREVERSIBLE. Do not use unless you absolutely want to remove an environment.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.fork_env\u003c/h4\u003e\u003ca id=\"user-content-visfork_env\" class=\"anchor\" aria-label=\"Permalink: vis.fork_env\" href=\"#visfork_env\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function forks an environment, similiar to the UI feature.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eArguments:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eprev_eid\u003c/code\u003e: Environment ID that we want to fork.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eeid\u003c/code\u003e: New Environment ID that will be created with the fork.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e: \u003ccode\u003efork_env\u003c/code\u003e an exception will occur if an env that doesn't exist is forked.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.win_exists\u003c/h4\u003e\u003ca id=\"user-content-viswin_exists\" class=\"anchor\" aria-label=\"Permalink: vis.win_exists\" href=\"#viswin_exists\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function returns a bool indicating whether or not a window \u003ccode\u003ewin\u003c/code\u003e exists on the server already. Returns None if something went wrong.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOptional arguments:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eenv\u003c/code\u003e: Environment to search for the window in. Default is \u003ccode\u003eNone\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.get_env_list\u003c/h4\u003e\u003ca id=\"user-content-visget_env_list\" class=\"anchor\" aria-label=\"Permalink: vis.get_env_list\" href=\"#visget_env_list\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function returns a list of all of the environments on the server at the time of calling. It takes no arguments.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.get_window_data\u003c/h4\u003e\u003ca id=\"user-content-visget_window_data\" class=\"anchor\" aria-label=\"Permalink: vis.get_window_data\" href=\"#visget_window_data\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function returns the window data for the given window. Returns data for all windows in an env if win is None.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eArguments:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eenv\u003c/code\u003e: Environment to search for the window in.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewin\u003c/code\u003e: Window to return data for. Set to \u003ccode\u003eNone\u003c/code\u003e to retrieve all the windows in an environment.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.check_connection\u003c/h4\u003e\u003ca id=\"user-content-vischeck_connection\" class=\"anchor\" aria-label=\"Permalink: vis.check_connection\" href=\"#vischeck_connection\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function returns a bool indicating whether or not the server is connected. It accepts an optional argument \u003ccode\u003etimeout_seconds\u003c/code\u003e for a number of seconds to wait for the server to come up.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003evis.replay_log\u003c/h4\u003e\u003ca id=\"user-content-visreplay_log\" class=\"anchor\" aria-label=\"Permalink: vis.replay_log\" href=\"#visreplay_log\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis function takes the contents of a visdom log and replays them to the current server to restore a state or handle any missing entries.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eArguments:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003elog_filename\u003c/code\u003e: log file to replay the contents of.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCustomizing Visdom\u003c/h2\u003e\u003ca id=\"user-content-customizing-visdom\" class=\"anchor\" aria-label=\"Permalink: Customizing Visdom\" href=\"#customizing-visdom\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe user config directory for visdom is\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003e~/.config/visdom\u003c/code\u003e for Linux\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e~/Library/Preferences/visdom\u003c/code\u003e for OSX\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e%APPDATA%/visdom\u003c/code\u003e for Windows\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eBy placing a \u003ccode\u003estyle.css\u003c/code\u003e in you user config directory, visdom will serve the customized css file along with the default style-file.\nIn addition, it is also possible to create a project-specific file; just place the file \u003ccode\u003estyle.css\u003c/code\u003e in your \u003ccode\u003eenv_path\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLicense\u003c/h2\u003e\u003ca id=\"user-content-license\" class=\"anchor\" aria-label=\"Permalink: License\" href=\"#license\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003evisdom is Apache 2.0 licensed, as found in the LICENSE file.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNote on Lua Torch Support\u003c/h2\u003e\u003ca id=\"user-content-note-on-lua-torch-support\" class=\"anchor\" aria-label=\"Permalink: Note on Lua Torch Support\" href=\"#note-on-lua-torch-support\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSupport for Lua Torch was deprecated following \u003ccode\u003ev0.1.8.4\u003c/code\u003e. If you'd like to use torch support, you'll need to download that release. You can follow the usage instructions there, but it is no longer officially supported.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContributing\u003c/h2\u003e\u003ca id=\"user-content-contributing\" class=\"anchor\" aria-label=\"Permalink: Contributing\" href=\"#contributing\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSee guidelines for contributing \u003ca href=\"/fossasia/visdom/blob/master/CONTRIBUTING.md\"\u003ehere.\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAcknowledgments\u003c/h2\u003e\u003ca id=\"user-content-acknowledgments\" class=\"anchor\" aria-label=\"Permalink: Acknowledgments\" href=\"#acknowledgments\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eVisdom was inspired by tools like \u003ca href=\"https://github.com/szym/display\"\u003edisplay\u003c/a\u003e and relies on \u003ca href=\"https://plot.ly/\" rel=\"nofollow\"\u003ePlotly\u003c/a\u003e as a plotting front-end.\u003c/p\u003e\n\u003c/article\u003e","loaded":true,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":[{"level":3,"text":"\n Creating, organizing \u0026 sharing visualizations of live, rich data. Supports Python.\n","anchor":"------------creating-organizing--sharing-visualizations-of-live-rich-data-supports-python","htmlText":"\n Creating, organizing \u0026amp; sharing visualizations of live, rich data. Supports Python.\n"},{"level":2,"text":"Concepts","anchor":"concepts","htmlText":"Concepts"},{"level":4,"text":"Selecting Environments","anchor":"selecting-environments","htmlText":"Selecting Environments"},{"level":4,"text":"Comparing Environments","anchor":"comparing-environments","htmlText":"Comparing Environments"},{"level":4,"text":"Clearing Environments","anchor":"clearing-environments","htmlText":"Clearing Environments"},{"level":4,"text":"Managing Environments","anchor":"managing-environments","htmlText":"Managing Environments"},{"level":3,"text":"Filter","anchor":"filter","htmlText":"Filter"},{"level":3,"text":"Views","anchor":"views","htmlText":"Views"},{"level":4,"text":"Saving/Deleting Views","anchor":"savingdeleting-views","htmlText":"Saving/Deleting Views"},{"level":4,"text":"Re-Packing","anchor":"re-packing","htmlText":"Re-Packing"},{"level":4,"text":"Reloading Views","anchor":"reloading-views","htmlText":"Reloading Views"},{"level":2,"text":"Setup","anchor":"setup","htmlText":"Setup"},{"level":2,"text":"Usage","anchor":"usage","htmlText":"Usage"},{"level":4,"text":"Command Line Options","anchor":"command-line-options","htmlText":"Command Line Options"},{"level":4,"text":"Python example","anchor":"python-example","htmlText":"Python example"},{"level":3,"text":"Demos","anchor":"demos","htmlText":"Demos"},{"level":2,"text":"API","anchor":"api","htmlText":"API"},{"level":3,"text":"Visdom Arguments (Python only)","anchor":"visdom-arguments-python-only","htmlText":"Visdom Arguments (Python only)"},{"level":3,"text":"Basics","anchor":"basics","htmlText":"Basics"},{"level":3,"text":"Plotting","anchor":"plotting","htmlText":"Plotting"},{"level":3,"text":"Generic Plots","anchor":"generic-plots","htmlText":"Generic Plots"},{"level":3,"text":"Others","anchor":"others","htmlText":"Others"},{"level":2,"text":"Details","anchor":"details","htmlText":"Details"},{"level":3,"text":"Basics","anchor":"basics-1","htmlText":"Basics"},{"level":4,"text":"vis.image","anchor":"visimage","htmlText":"vis.image"},{"level":4,"text":"vis.images","anchor":"visimages","ht 8000 mlText":"vis.images"},{"level":4,"text":"vis.text","anchor":"vistext","htmlText":"vis.text"},{"level":4,"text":"vis.properties","anchor":"visproperties","htmlText":"vis.properties"},{"level":4,"text":"vis.audio","anchor":"visaudio","htmlText":"vis.audio"},{"level":4,"text":"vis.video","anchor":"visvideo","htmlText":"vis.video"},{"level":4,"text":"vis.svg","anchor":"vissvg","htmlText":"vis.svg"},{"level":4,"text":"vis.matplot","anchor":"vismatplot","htmlText":"vis.matplot"},{"level":4,"text":"vis.plotlyplot","anchor":"visplotlyplot","htmlText":"vis.plotlyplot"},{"level":4,"text":"vis.embeddings","anchor":"visembeddings","htmlText":"vis.embeddings"},{"level":4,"text":"vis.save","anchor":"vissave","htmlText":"vis.save"},{"level":3,"text":"Plotting","anchor":"plotting-1","htmlText":"Plotting"},{"level":4,"text":"vis.scatter","anchor":"visscatter","htmlText":"vis.scatter"},{"level":4,"text":"vis.sunburst","anchor":"vissunburst","htmlText":"vis.sunburst"},{"level":4,"text":"vis.line","anchor":"visline","htmlText":"vis.line"},{"level":4,"text":"vis.stem","anchor":"visstem","htmlText":"vis.stem"},{"level":4,"text":"vis.heatmap","anchor":"visheatmap","htmlText":"vis.heatmap"},{"level":4,"text":"vis.bar","anchor":"visbar","htmlText":"vis.bar"},{"level":4,"text":"vis.histogram","anchor":"vishistogram","htmlText":"vis.histogram"},{"level":4,"text":"vis.boxplot","anchor":"visboxplot","htmlText":"vis.boxplot"},{"level":4,"text":"vis.surf","anchor":"vissurf","htmlText":"vis.surf"},{"level":4,"text":"vis.contour","anchor":"viscontour","htmlText":"vis.contour"},{"level":4,"text":"vis.quiver","anchor":"visquiver","htmlText":"vis.quiver"},{"level":4,"text":"vis.mesh","anchor":"vismesh","htmlText":"vis.mesh"},{"level":4,"text":"vis.dual_axis_lines","anchor":"visdual_axis_lines","htmlText":"vis.dual_axis_lines"},{"level":3,"text":"Network Graph","anchor":"network-graph","htmlText":"Network Graph"},{"level":3,"text":"Customizing plots","anchor":"customizing-plots","htmlText":"Customizing plots"},{"level":3,"text":"Others","anchor":"others-1","htmlText":"Others"},{"level":4,"text":"vis.close","anchor":"visclose","htmlText":"vis.close"},{"level":4,"text":"vis.delete_env","anchor":"visdelete_env","htmlText":"vis.delete_env"},{"level":4,"text":"vis.fork_env","anchor":"visfork_env","htmlText":"vis.fork_env"},{"level":4,"text":"vis.win_exists","anchor":"viswin_exists","htmlText":"vis.win_exists"},{"level":4,"text":"vis.get_env_list","anchor":"visget_env_list","htmlText":"vis.get_env_list"},{"level":4,"text":"vis.get_window_data","anchor":"visget_window_data","htmlText":"vis.get_window_data"},{"level":4,"text":"vis.check_connection","anchor":"vischeck_connection","htmlText":"vis.check_connection"},{"level":4,"text":"vis.replay_log","anchor":"visreplay_log","htmlText":"vis.replay_log"},{"level":2,"text":"Customizing Visdom","anchor":"customizing-visdom","htmlText":"Customizing Visdom"},{"level":2,"text":"License","anchor":"license","htmlText":"License"},{"level":2,"text":"Note on Lua Torch Support","anchor":"note-on-lua-torch-support","htmlText":"Note on Lua Torch Support"},{"level":2,"text":"Contributing","anchor":"contributing","htmlText":"Contributing"},{"level":2,"text":"Acknowledgments","anchor":"acknowledgments","htmlText":"Acknowledgments"}],"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Ffossasia%2Fvisdom"}},{"displayName":"CODE_OF_CONDUCT.md","repoName":"visdom","refName":"master","path":"CODE_OF_CONDUCT.md","preferredFileType":"code_of_conduct","tabName":"Code of conduct","richText":null,"loaded":false,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":null,"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Ffossasia%2Fvisdom"}},{"displayName":"LICENSE","repoName":"visdom","refName":"master","path":"LICENSE","preferredFileType":"license","tabName":"License","richText":null,"loaded":false,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":null,"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Ffossasia%2Fvisdom"}}],"overviewFilesProcessingTime":0}},"appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-7d7eb7c71814.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-708ec8ade250.js","githubDevUrl":null,"enabled_features":{"copilot_workspace":null,"code_nav_ui_events":false,"react_blob_overlay":false,"accessible_code_button":true,"github_models_repo_integration":false}}}}

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation


Logo

Creating, organizing & sharing visualizations of live, rich data. Supports Python.

Jump To: Setup, Usage, API, Customizing, Contributing, License

Visdom aims to facilitate visualization of (remote) data with an emphasis on supporting scientific experimentation.
Broadcast visualizations of plots, images, and text for yourself and your collaborators. Organize your visualization space programmatically or through the UI to create dashboards for live data, inspect results of experiments, or debug experimental code.

Concepts

Visdom has a simple set of features that can be composed for various use-cases.

Windows

The UI begins as a blank slate – you can populate it with plots, images, and text. These appear in windows that you can drag, drop, resize, and destroy. The windows live in envs and the state of envs is stored across sessions. You can download the content of windows – including your plots in svg.

Tip: You can use the zoom of your browser to adjust the scale of the UI.

Callbacks

The python Visdom implementation supports callbacks on a window. The demo shows an example of this in the form of an editable text pad. The functionality of these callbacks allows the Visdom object to receive and react to events that happen in the frontend.

You can subscribe a window to events by adding a function to the event handlers dict for the window id you want to subscribe by calling viz.register_event_handler(handler, win_id) with your handler and the window id. Multiple handlers can be registered to the same window. You can remove all event handlers from a window using viz.clear_event_handlers(win_id). When an event occurs to that window, your callbacks will be called on a dict containing:

  • event_type: one of the below event types
  • pane_data: all of the stored contents for that window including layout and content.
  • eid: the current environment id
  • target: the window id the event is called on

Additional parameters are defined below.

Right now the following callback events are supported:

  1. Close - Triggers when a window is closed. Returns a dict with only the aforementioned fields.
  2. KeyPress - Triggers when a key is pressed. Contains additional parameters:
    • key - A string representation of the key pressed (applying state modifiers such as SHIFT)
    • key_code - The javascript event keycode for the pressed key (no modifiers)
  3. PropertyUpdate - Triggers when a property is updated in Property pane
    • propertyId - Position in properties list
    • value - New property value
  4. Click - Triggers when Image pane is clicked on, has a parameter:
    • image_coord - dictionary with the fields x and y for the click coordinates in the coordinate frame of the possibly zoomed/panned image (not the enclosing pane).
Editable Plot Parameters Use the top-right *edit*-Button to inspect all parameters used for plot in the respective window. The visdom client supports dynamic change of plot parameters as well. Just change one of the listed parameters, the plot will be altered on-the-fly. Click the button again to close the property list.

Environments

You can partition your visualization space with envs. By default, every user will have an env called main. New envs can be created in the UI or programmatically. The state of envs is chronically saved. Environments are able to keep entirely different pools of plots.

You can access a specific env via url: http://localhost.com:8097/env/main. If your server is hosted, you can share this url so others can see your visualizations too.

Environments are automatically hierarchically organized by the first _.

Selecting Environments

From the main page it is possible to toggle between different environments using the environment selector. Selecting a new environment will query the server for the plots that exist in that environment. The environment selector allows for searching and filtering for the new enironment.

Comparing Environments

From the main page it is possible to compare different environments using the environment selector. Selecting multiple environments in the check box will query the server for the plots with the same titles in all environments and plot them in a single plot. An additional compare legend pane is created with a number corresponding to each selected environment. Individual plots are updated with legends corresponding to "x_name" where x is a number corresponding with the compare legend pane and name is the original name in the legend.

Note: The compare envs view is not robust to high throughput data, as the server is responsible for generating the compared content. Do not compare an environment that is receiving a high quantity of updates on any plot, as every update will request regenerating the comparison. If you need to compare two plots that are receiving high quantities of data, have them share the same window on a singular env.

Clearing Environments

You can use the eraser button to remove all of the current contents of an environment. This closes the plot windows for that environment but keeps the empty environment for new plots.

Managing Environments

Pressing the folder icon opens a dialog that allows you to fork or force save the current environment, or delete any of your existing environments. Use of this feature is fully described in the State section.

Env Files: Your envs are loaded upon request by the user, by default from $HOME/.visdom/. Custom paths can be passed as a cmd-line argument. Envs are removed by using the delete button or by deleting the corresponding .json file from the env dir. In case you want the server to pre-load all files into cache, use the flag -eager_data_loading.

State

Once you've created a few visualizations, state is maintained. The server automatically caches your visualizations -- if you reload the page, your visualizations reappear.

  • Save: You can manually do so with the save button. This will serialize the env's state (to disk, in JSON), including window positions. You can save an env programmatically.
    This is helpful for more sophisticated visualizations in which configuration is meaningful, e.g. a data-rich demo, a model training dashboard, or systematic experimentation. This also makes them easy to share and reuse.

  • Fork: If you enter a new env name, saving will create a new env -- effectively forking the previous env.

Tip: Fork an environment before you begin to make edits to ensure that your changes are saved seperately.

Filter

You can use the filter to dynamically sift through windows present in an env -- just provide a regular expression with which to match titles of window you want to show. This can be helpful in use cases involving an env with many windows e.g. when systematically checking experimental results.

Note: If you have saved your current view, the view will be restored after clearing the filter.

Views

It is possible to manage the views simply by dragging the tops of windows around, however additional features exist to keep views organized and save common views. View management can be useful for saving and switching between multiple common organizations of your windows.

Saving/Deleting Views

Using the folder icon, a dialog window opens where views can be forked in the same way that envs can be. Saving a view will retain the position and sizes of all of the windows in a given environment. Views are saved in $HOME/.visdom/view/layouts.json in the visdom filepath.

Note: Saved views are static, and editing a saved view copies that view over to the current view where editing can occur.

Re-Packing

Using the repack icon (9 boxes), visdom will attempt to pack your windows in a way that they best fit while retaining row/column ordering.

Note: Due to the reliance on row/column ordering and ReactGridLayout the final layout might be slightly different than what might be expected. We're working on improving that experience or providing alternatives that give more fine-tuned control.

Reloading Views

Using the view dropdown it is possible to select previously saved views, restoring the locations and sizes of all of the windows within the current environment to the places they were when that view was saved last.

Setup

Python and web clients come bundled with the python server.

Install from pip

> pip install visdom

Install from source

> pip install git+https://github.com/fossasia/visdom

Usage

Start the server (probably in a screen or tmux) from the command line:

> visdom

Visdom now can be accessed by going to http://localhost:8097 in your browser, or your own host address if specified.

The visdom command is equivalent to running python -m visdom.server.

If the above does not work, try using an SSH tunnel to your server by adding the following line to your local ~/.ssh/config: LocalForward 127.0.0.1:8097 127.0.0.1:8097.

Command Line Options

The following options can be provided to the server:

  1. -port : The port to run the server on.
  2. -hostname : The hostname to run the server on.
  3. -base_url : The base server url (default = /).
  4. -env_path : The path to the serialized session to reload.
  5. -logging_level : Logging level (default = INFO). Accepts both standard text and numeric logging values.
  6. -readonly : Flag to start server in readonly mode.
  7. -enable_login : Flag to setup authentication for the sever, requiring a username and password to login.
  8. -force_new_cookie : Flag to reset the secure cookie used by the server, invalidating current login cookies. Requires -enable_login.
  9. -bind_local : Flag to make the server accessible only from localhost.
  10. -eager_data_loading : By default visdom loads environments lazily upon user request. Setting this flag lets visdom pre-fetch all environments upon startup.

When -enable_login flag is provided, the server asks user to input credentials using terminal prompt. Alternatively, you can setup VISDOM_USE_ENV_CREDENTIALS env variable, and then provide your username and password via VISDOM_USERNAME and VISDOM_PASSWORD env variables without manually interacting with the terminal. This setup is useful in case if you would like to launch visdom server from bash script, or from Jupyter notebook.

VISDOM_USERNAME=username
VISDOM_PASSWORD=password
VISDOM_USE_ENV_CREDENTIALS=1 visdom -enable_login

You can also use VISDOM_COOKIE variable to provide cookies value if the cookie file wasn't generated, or the flag -force_new_cookie was set.

Python example

import visdom
import numpy as np
vis = visdom.Visdom()
vis.text('Hello, world!')
vis.image(np.ones((3, 10, 10)))

Demos

If you have cloned this repository, you can run our demo showcase.

python example/demo.py

API

For a quick introduction into the capabilities of visdom, have a look at the example directory, or read the details below.

Visdom Arguments (Python only)

The python visdom client takes a few options:

  • server: the hostname of your visdom server (default: 'http://localhost')
  • port: the port for your visdom server (default: 8097)
  • base_url: the base visdom server url (default: /)
  • env: Default environment to plot to when no env is provided (default: main)
  • raise_exceptions: Raise exceptions upon failure rather than printing them (default: True (soon))
  • log_to_filename: If not none, log all plotting and updating events to the given file (append mode) so that they can be replayed later using replay_log (default: None)
  • use_incoming_socket: enable use of the socket for receiving events from the web client, allowing user to register callbacks (default: True)
  • http_proxy_host: Deprecated. Use Proxies argument for complete proxy support.
  • http_proxy_port: Deprecated. Use Proxies argument for complete proxy support.
  • username: username to use for authentication, if server started with -enable_login (default: None)
  • password: password to use for authentication, if server started with -enable_login (default: None)
  • proxies: Dictionary mapping protocol to the URL of the proxy (e.g. {http: foo.bar:3128}) to be used on each Request. (default: None)
  • offline: Flag to run visdom in offline mode, where all requests are logged to file rather than to the server. Requires log_to_filename is set. In offline mode, all visdom commands that don't create or update plots will simply return True. (default: False)

Other options are either currently unused (endpoint, ipv6) or used for internal functionality.

Basics

Visdom offers the following basic visualization functions:

Plotting

We have wrapped several common plot types to make creating basic visualizations easily. These visualizations are powered by Plotly.

The following API is currently supported:

Generic Plots

Note that the server API adheres to the Plotly convention of data and layout objects, such that you can produce your own arbitrary Plotly visualizations:

import visdom
vis = visdom.Visdom()

trace = dict(x=[1, 2, 3], y=[4, 5, 6], mode="markers+lines", type='custom',
             marker={'color': 'red', 'symbol': 104, 'size': "10"},
             text=["one", "two", "three"], name='1st Trace')
layout = dict(title="First Plot", xaxis={'title': 'x1'}, yaxis={'title': 'x2'})

vis._send({'data': [trace], 'layout': layout, 'win': 'mywin'})

Others

Details

Basics

vis.image

This function draws an img. It takes as input an CxHxW tensor img that contains the image.

The following opts are supported:

  • jpgquality: JPG quality (number 0-100). If defined image will be saved as JPG to reduce file size. If not defined image will be saved as PNG.
  • caption: Caption for the image
  • store_history: Keep all images stored to the same window and attach a slider to the bottom that will let you select the image to view. You must always provide this opt when sending new images to an image with history.

Note You can use alt on an image pane to view the x/y coordinates of the cursor. You can also ctrl-scroll to zoom, alt scroll to pan vertically, and alt-shift scroll to pan horizontally. Double click inside the pane to restore the image to default.

vis.images

This function draws a list of images. It takes an input B x C x H x W tensor or a list of images all of the same size. It makes a grid of images of size (B / nrow, nrow).

The following arguments and opts are supported:

  • nrow: Number of images in a row
  • padding: Padding around the image, equal padding around all 4 sides
  • opts.jpgquality: JPG quality (number 0-100). If defined image will be saved as JPG to reduce file size. If not defined image will be saved as PNG.
  • opts.caption: Caption for the image

vis.text

This function prints text in a box. You can use this to embed arbitrary HTML. It takes as input a text string. No specific opts are currently supported.

vis.properties

This function shows editable properties in a pane. Properties are expected to be a List of Dicts e.g.:

    properties = [
        {'type': 'text', 'name': 'Text input', 'value': 'initial'},
        {'type': 'number', 'name': 'Number input', 'value': '12'},
        {'type': 'button', 'name': 'Button', 'value': 'Start'},
        {'type': 'checkbox', 'name': 'Checkbox', 'value': True},
        {'type': 'select', 'name': 'Select', 'value': 1, 'values': ['Red', 'Green', 'Blue']},
    ]

Supported types:

  • text: string
  • number: decimal number
  • button: button labeled with "value"
  • checkbox: boolean value rendered as a checkbox
  • select: multiple values select box
    • value: id of selected value (zero based)
    • values: list of possible values

Callback are called on property value update:

  • event_type: "PropertyUpdate"
  • propertyId: position in the properties list
  • value: new value

No specific opts are currently supported.

vis.audio

This function plays audio. It takes as input the filename of the audio file or an N tensor containing the waveform (use an Nx2 matrix for stereo audio). The function does not support any plot-specific opts.

The following opts are supported:

  • opts.sample_frequency: sample frequency (integer > 0; default = 44100)

Known issue: Visdom uses scipy to convert tensor inputs to wave files. Some versions of Chrome are known not to play these wave files (Firefox and Safari work fine).

vis.video

This function plays a video. It takes as input the filename of the video videofile or a LxHxWxC-sized tensor containing all the frames of the video as input. The function does not support any plot-specific opts.

The following opts are supported:

  • opts.fps: FPS for the video (integer > 0; default = 25)

Note: Using tensor input requires that ffmpeg is installed and working. Your ability to play video may depend on the browser you use: your browser has to support the Theano codec in an OGG container (Chrome supports this).

vis.svg

This function draws an SVG object. It takes as input a SVG string svgstr or the name of an SVG file svgfile. The function does not support any specific opts.

vis.matplot

This function draws a Matplotlib plot. The function supports one plot-specific option: resizable.

Note When set to True the plot is resized with the pane. You need beautifulsoup4 and lxml packages installed to use this option.

Note: matplot is not rendered using the same backend as plotly plots, and is somewhat less efficient. Using too many matplot windows may degrade visdom performance.

vis.plotlyplot

This function draws a Plotly Figure object. It does not explicitly take options as it assumes you have already explicitly configured the figure's layout.

Note You must have the plotly Python package installed to use this function. It can typically be installed by running pip install plotly.

vis.embeddings

This function visualizes a collection of features using the Barnes-Hut t-SNE algorithm.

The function accepts the following arguments:

  • features: a list of tensors
  • labels: a list of corresponding labels for the tensors provided for features
  • data_getter=fn: (optional) a function that takes as a parameter an index into the features array and returns a summary representation of the tensor. If this is set, data_type must also be set.
  • data_type=str: (optional) currently the only acceptable value here is "html"

We currently assume that there are no more than 10 unique labels, in the future we hope to provide a colormap in opts for other cases.

From the UI you can also draw a lasso around a subset of features. This will rerun the t-SNE visualization on the selected subset.

vis.save

This function saves the envs that are alive on the visdom server. It takes input a list of env ids to be saved.

Plotting

Further details on the wrapped plotting functions are given below.

The exact inputs into the plotting functions vary, although most of them take as input a tensor X than contains the data and an (optional) tensor Y that contains optional data variables (such as labels or timestamps). All plotting functions take as input an optional win that can be used to plot into a specific window; each plotting function also returns the win of the window it plotted in. One can also specify the env to which the visualization should be added.

vis.scatter

This function draws a 2D or 3D scatter plot. It takes as input an Nx2 or Nx3 tensor X that specifies the locations of the N points in the scatter plot. An optional N tensor Y containing discrete labels that range between 1 and K can be specified as well -- the labels will be reflected in the colors of the markers.

update can be used to efficiently update the data of an existing plot. Use 'append' to append data, 'replace' to use new data, or 'remove' to remove the trace specified by name. Using update='append' will create a plot if it doesn't exist and append to the existing plot otherwise. If updating a single trace, use name to specify the name of the trace to be updated. Update data that is all NaN is ignored (can be used for masking update).

The following opts are supported:

  • opts.markersymbol : marker symbol (string; default = 'dot')
  • opts.markersize : marker size (number; default = '10')
  • opts.markercolor : color per marker. (torch.*Tensor; default = nil)
  • opts.markerborderwidth: marker border line width (float; default = 0.5)
  • opts.legend : table containing legend names
  • opts.textlabels : text label for each point (list: default = None)
  • opts.layoutopts : dict of any additional options that the graph backend accepts for a layout. For example layoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}.
  • opts.traceopts : dict mapping trace names or indices to dicts of additional options that the graph backend accepts. For example traceopts = {'plotly': {'myTrace': {'mode': 'markers'}}}.
  • opts.webgl : use WebGL for plotting (boolean; default = false). It is faster if a plot contains too many points. Use sparingly as browsers won't allow more than a couple of WebGL contexts on a single page.

opts.markercolor is a Tensor with Integer values. The tensor can be of size N or N x 3 or K or K x 3.

  • Tensor of size N: Single intensity value per data point. 0 = black, 255 = red
  • Tensor of size N x 3: Red, Green and Blue intensities per data point. 0,0,0 = black, 255,255,255 = white
  • Tensor of size K and K x 3: Instead of having a unique color per data point, the same color is shared for all points of a particular label.

vis.sunburst

This function draws a sunburst chart. It takes two inputs: parents and labels array. values from parents array is used as parents object, like it define above which sector should the this sector shown. values from labels array is used to define sector's label or you can say name. keep in mind that lenght of array parents and labels should be equal. There is a third array that you can pass to which is value, it is use to show a value on hovering over a sector, it is optional argument, but if you are passing it then keep in mind lenght of values should be equal to parents or labels.

Following opts are currently supported:

  • opts.font_size : define font size of label (int)
  • opts.font_color : define font color of label (string)
  • opts.opacity : define opacity of chart (float)
  • opts.line_width : define distance between two sectors and sector to its parents (int)

vis.line

This function draws a line plot. It takes as input an N or NxM tensor Y that specifies the values of the M lines (that connect N points) to plot. It also takes an optional X tensor that specifies the corresponding x-axis values; X can be an N tensor (in which case all lines will share the same x-axis values) or have the same size as Y.

update can be used to efficiently update the data of an existing plot. Use 'append' to append data, 'replace' to use new data, or 'remove' to remove the trace specified by name. If updating a single trace, use name to specify the name of the trace to be updated. Update data that is all NaN is ignored (can be used for masking update).

Smoothing: Line plots can be smoothened using Savitzky-Golay filtering. This feature can be enabled by clicking the ~-symbol in the top right corner of a window that contains a line plot.

Demo of interactive smoothing.

The following opts are supported:

  • opts.fillarea : fill area below line (boolean)
  • opts.markers : show markers (boolean; default = false)
  • opts.markersymbol: marker symbol (string; default = 'dot')
  • opts.markersize : marker size (number; default = '10')
  • opts.linecolor : line colors (np.array; default = None)
  • opts.dash : line dash type for each line (np.array; default = 'solid'), one of solid, dash, dashdot or dash, size should match number of lines being drawn
  • opts.legend : table containing legend names
  • opts.layoutopts : dict of any additional options that the graph backend accepts for a layout. For example layoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}.
  • opts.traceopts : dict mapping trace names or indices to dicts of additional options that plot.ly accepts for a trace.
  • opts.webgl : use WebGL for plotting (boolean; default = false). It is faster if a plot contains too many points. Use sparingly as browsers won't allow more than a couple of WebGL contexts on a single page.

vis.stem

This function draws a stem plot. It takes as input an N or NxM tensor X that specifies the values of the N points in the M time series. An optional N or NxM tensor Y containing timestamps can be specified as well; if Y is an N tensor then all M time series are assumed to have the same timestamps.

The following opts are supported:

  • opts.colormap: colormap (string; default = 'Viridis')
  • opts.legend : table containing legend names
  • opts.layoutopts : dict of any additional options that the graph backend accepts for a layout. For example layoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}.

vis.heatmap

This function draws a heatmap. It takes as input an NxM tensor X that specifies the value at each location in the heatmap.

update can be used to efficiently update the data of an existing plot. Use 'appendRow' to append data row-wise, 'appendColumn' to append data column-wise, 'prependRow' to prepend data row-wise, 'prependColumn' to prepend data column-wise, 'replace' to use new data, or 'remove' to remove the plot specified by win.

The following opts are supported:

  • opts.colormap : colormap (string; default = 'Viridis')
  • opts.xmin : clip minimum value (number; default = X:min())
  • opts.xmax : clip maximum value (number; default = X:max())
  • opts.columnnames: table containing x-axis labels
  • opts.rownames : table containing y-axis labels
  • opts.layoutopts : dict of any additional options that the graph backend accepts for a layout. For example layoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}.
  • opts.nancolor : color for plotting NaNs. If this is None, NaNs will be plotted as transparent. (string; default = None)

vis.bar

This function draws a regular, stacked, or grouped bar plot. It takes as input an N or NxM tensor X that specifies the height of each of the bars. If X contains M columns, the values corresponding to each row are either stacked or grouped (depending on how opts.stacked is set). In addition to X, an (optional) N tensor Y can be specified that contains the corresponding x-axis values.

The following plot-specific opts are currently supported:

  • opts.rownames: table containing x-axis labels
  • opts.stacked : stack multiple columns in X
  • opts.legend : table containing legend labels
  • opts.layoutopts : dict of any additional options that the graph backend accepts for a layout. For example layoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}.

vis.histogram

This function draws a histogram of the specified data. It takes as input an N tensor X that specifies the data of which to construct the histogram.

The following plot-specific opts are currently supported:

  • opts.numbins: number of bins (number; default = 30)
  • opts.layoutopts : dict of any additional options that the graph backend accepts for a layout. For example layoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}.

vis.boxplot

This function draws boxplots of the specified data. It takes as input an N or an NxM tensor X that specifies the N data values of which to construct the M boxplots.

The following plot-specific opts are currently supported:

  • opts.legend: labels for each of the columns in X
  • opts.layoutopts : dict of any additional options that the graph backend accepts for a layout. For example layoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}.

vis.surf

This function draws a surface plot. It takes as input an NxM tensor X that specifies the value at each location in the surface plot.

The following opts are supported:

  • opts.colormap: colormap (string; default = 'Viridis')
  • opts.xmin : clip minimum value (number; default = X:min())
  • opts.xmax : clip maximum value (number; default = X:max())
  • opts.layoutopts : dict of any additional options that the graph backend accepts for a layout. For example layoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}.

vis.contour

This function draws a contour plot. It takes as input an NxM tensor X that specifies the value at each location in the contour plot.

The following opts are supported:

  • opts.colormap: colormap (string; default = 'Viridis')
  • opts.xmin : clip minimum value (number; default = X:min())
  • opts.xmax : clip maximum value (number; default = X:max())
  • opts.layoutopts : dict of any additional options that the graph backend accepts for a layout. For example layoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}.

vis.quiver

This function draws a quiver plot in which the direction and length of the arrows is determined by the NxM tensors X and Y. Two optional NxM tensors gridX and gridY can be provided that specify the offsets of the arrows; by default, the arrows will be done on a regular grid.

The following opts are supported:

  • opts.normalize: length of longest arrows (number)
  • opts.arrowheads: show arrow heads (boolean; default = true)
  • opts.layoutopts : dict of any additional options that the graph backend accepts for a layout. For example layoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}.

vis.mesh

This function draws a mesh plot from a set of vertices defined in an Nx2 or Nx3 matrix X, and polygons defined in an optional Mx2 or Mx3 matrix Y.

The following opts are supported:

  • opts.color: color (string)
  • opts.opacity: opacity of polygons (number between 0 and 1)
  • opts.layoutopts : dict of any additional options that the graph backend accepts for a layout. For example layoutopts = {'plotly': {'legend': {'x':0, 'y':0}}}.

vis.dual_axis_lines

This function will create a line plot using plotly with different Y-Axis.

X = A numpy array of the range.

Y1 = A numpy array of the same count as X.

Y2 = A numpy array of the same count as X.

The following opts are supported:

  • opts.height : Height of the plot
  • opts.width : Width of the plot
  • opts.name_y1 : Axis name for Y1 plot
  • opts.name_y2 : Axis name for Y2 plot
  • opts.title : Title of the plot
  • opts.color_title_y1 : Color of the Y1 axis Title
  • opts.color_tick_y1 : Color of the Y1 axis Ticks
  • opts.color_title_y2 : Color of the Y2 axis Title
  • opts.color_tick_y2 : Color of the Y2 axis Ticks
  • opts.side : side on which the Y2 tick has to be placed. Has values 'right' or left.
  • opts.showlegend : Display legends (boolean values)
  • opts.top : Set the top margin of the plot
  • opts.bottom : Set the bottom margin of the plot
  • opts.right : Set the right margin of the plot
  • opts.left : Set the left margin of the plot

This is the image of the output:

Network Graph

This function draws a graph, in which the nodes and edges are taken from a 2-D matrix of size [,2] where each row contains a source and destination node value. The numeric value used to define nodes should be strictly between (0 to n-1), where n is the number of nodes.

There are two optional arguments :

  • edgeLabels : list of custom edge labels. If not provided each edge gets a label, "source-destination", eg "1-2", size should be equal to size of input "edges". Optional.
  • nodeLabels : list of custom node labels. If not provided each node gets a label same as the numeric value defined in the "edges". size should be equal to number of nodes present. Optional.

The following opts are supported:

  • opts.height : Height of the plot. Default : 500
  • opts.width : Width of the plot. Default : 500
  • opts.directed : whether the plot should have a arrow or not. Default : false
  • opts.showVertexLabels : Whether to show vertex labels. Default : true
  • opts.showEdgeLabels : Whether to show edge labels. Default : false
  • opts.scheme : Whether all nodes shoud have "same" color or "different". Default : "same"

Customizing plots

The plotting functions take an optional opts table as input that can be used to change (generic or plot-specific) properties of the plots.

All input arguments are specified in a single table; the input arguments are matches based on the keys they have in the input table.

The following opts are generic in the sense that they are the same for all visualizations (except plot.image, plot.text, plot.video, and plot.audio):

  • opts.title : figure title
  • opts.width : figure width
  • opts.height : figure height
  • opts.showlegend : show legend (true or false)
  • opts.xtype : type of x-axis ('linear' or 'log')
  • opts.xlabel : label of x-axis
  • opts.xtick : show ticks on x-axis (boolean)
  • opts.xtickmin : first tick on x-axis (number)
  • opts.xtickmax : last tick on x-axis (number)
  • opts.xtickvals : locations of ticks on x-axis (table of numbers)
  • opts.xticklabels : ticks labels on x-axis (table of strings)
  • opts.xtickstep : distances between ticks on x-axis (number)
  • opts.xtickfont : font for x-axis labels (dict of font information)
  • opts.ytype : type of y-axis ('linear' or 'log')
  • opts.ylabel : label of y-axis
  • opts.ytick : show ticks on y-axis (boolean)
  • opts.ytickmin : first tick on y-axis (number)
  • opts.ytickmax : last tick on y-axis (number)
  • opts.ytickvals : locations of ticks on y-axis (table of numbers)
  • opts.yticklabels : ticks labels on y-axis (table of strings)
  • opts.ytickstep : distances between ticks on y-axis (number)
  • opts.ytickfont : font for y-axis labels (dict of font information)
  • opts.marginleft : left margin (in pixels)
  • opts.marginright : right margin (in pixels)
  • opts.margintop : top margin (in pixels)
  • opts.marginbottom: bottom margin (in pixels)

opts are passed as dictionary in python scripts.You can pass opts like:

opts=dict(title="my title", xlabel="x axis",ylabel="y axis")

OR

opts={"title":"my title", "xlabel":"x axis","ylabel":"y axis"}

The other options are visualization-specific, and are described in the documentation of the functions.

Others

vis.close

This function closes a specific window. It takes input window id win and environment id eid. Use win as None to close all windows in an environment.

vis.delete_env

This function deletes a specified env entirely. It takes env id eid as input.

Note: delete_env is deletes all data for an environment and is IRREVERSIBLE. Do not use unless you absolutely want to remove an environment.

vis.fork_env

This function forks an environment, similiar to the UI feature.

Arguments:

  • prev_eid: Environment ID that we want to fork.
  • eid: New Environment ID that will be created with the fork.

Note: fork_env an exception will occur if an env that doesn't exist is forked.

vis.win_exists

This function returns a bool indicating whether or not a window win exists on the server already. Returns None if something went wrong.

Optional arguments:

  • env: Environment to search for the window in. Default is None.

vis.get_env_list

This function returns a list of all of the environments on the server at the time of calling. It takes no arguments.

vis.get_window_data

This function returns the window data for the given window. Returns data for all windows in an env if win is None.

Arguments:

  • env: Environment to search for the window in.
  • win: Window to return data for. Set to None to retrieve all the windows in an environment.

vis.check_connection

This function returns a bool indicating whether or not the server is connected. It accepts an optional argument timeout_seconds for a number of seconds to wait for the server to come up.

vis.replay_log

This function takes the contents of a visdom log and replays them to the current server to restore a state or handle any missing entries.

Arguments:

  • log_filename: log file to replay the contents of.

Customizing Visdom

The user config directory for visdom is

  • ~/.config/visdom for Linux
  • ~/Library/Preferences/visdom for OSX
  • %APPDATA%/visdom for Windows

By placing a style.css in you user config directory, visdom will serve the customized css file along with the default style-file. In addition, it is also possible to create a project-specific file; just place the file style.css in your env_path.

License

visdom is Apache 2.0 licensed, as found in the LICENSE file.

Note on Lua Torch Support

Support for Lua Torch was deprecated following v0.1.8.4. If you'd like to use torch support, you'll need to download that release. You can follow the usage instructions there, but it is no longer officially supported.

Contributing

See guidelines for contributing here.

Acknowledgments

Visdom was inspired by tools like display and relies on Plotly as a plotting front-end.

0