Title: [ENH]: Add a QtPgfPng backend? · Issue #28086 · matplotlib/matplotlib · GitHub
Open Graph Title: [ENH]: Add a QtPgfPng backend? · Issue #28086 · matplotlib/matplotlib
X Title: [ENH]: Add a QtPgfPng backend? · Issue #28086 · matplotlib/matplotlib
Description: Problem Per #28084 and a few other older similar issues, some users are confused because they cannot see pgf-generated plots (which can include xelatex/lualatex-specific latex constructs, in particular) interactively, as the interactive ...
Open Graph Description: Problem Per #28084 and a few other older similar issues, some users are confused because they cannot see pgf-generated plots (which can include xelatex/lualatex-specific latex constructs, in partic...
X Description: Problem Per #28084 and a few other older similar issues, some users are confused because they cannot see pgf-generated plots (which can include xelatex/lualatex-specific latex constructs, in partic...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/28086
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[ENH]: Add a QtPgfPng backend?","articleBody":"### Problem\r\n\r\nPer #28084 and a few other older similar issues, some users are confused because they cannot see pgf-generated plots (which can include xelatex/lualatex-specific latex constructs, in particular) interactively, as the interactive guis still use the \"standard\" latex support.\r\n\r\nAs it turns out it is relatively easy(?) to implement a minimal \"interactive\" backend that uses pgf and pdf-\u003epng to conversion to interactively display pgf-generated plots. Obviously it has the *most terrible* performance ever (each draw involves a full tex compilation of the image), but (per the above) it could have some uses...\r\n\r\n### Proposed solution\r\n\r\nMinimum patch implementing the (minimally tested...) backend is below. Test e.g. by setting MPLBACKEND to qtpgfpng and plotting.\r\n\r\n```patch\r\ndiff --git c/lib/matplotlib/backends/backend_qtpgfpng.py i/lib/matplotlib/backends/backend_qtpgfpng.py\r\nnew file mode 100644\r\nindex 0000000000..f44097dc0b\r\n--- /dev/null\r\n+++ i/lib/matplotlib/backends/backend_qtpgfpng.py\r\n@@ -0,0 +1,27 @@\r\n+from tempfile import TemporaryDirectory\r\n+\r\n+import numpy as np\r\n+import PIL.Image\r\n+\r\n+from .backend_pgf import FigureCanvasPgf\r\n+from .backend_qt import FigureCanvasQT\r\n+from .qt_compat import QtGui\r\n+\r\n+\r\n+class FigureCanvasQTPgfPng(FigureCanvasPgf, FigureCanvasQT):\r\n+ def paintEvent(self, event):\r\n+ with TemporaryDirectory() as tmpdir:\r\n+ self.print_png(f\"{tmpdir}/image.png\")\r\n+ img = np.asarray(PIL.Image.open(f\"{tmpdir}/image.png\"))\r\n+ qimage = QtGui.QImage(\r\n+ img, img.shape[1], img.shape[0],\r\n+ QtGui.QImage.Format.Format_RGBA8888)\r\n+ qimage.setDevicePixelRatio(self.device_pixel_ratio)\r\n+ painter = QtGui.QPainter(self)\r\n+ painter.eraseRect(event.rect())\r\n+ painter.drawImage(0, 0, qimage)\r\n+ self._draw_rect_callback(painter)\r\n+ painter.end()\r\n+\r\n+\r\n+FigureCanvas = FigureCanvasQTPgfPng\r\ndiff --git c/lib/matplotlib/backends/meson.build i/lib/matplotlib/backends/meson.build\r\nindex 1e3e47c0a9..967cab902b 100644\r\n--- c/lib/matplotlib/backends/meson.build\r\n+++ i/lib/matplotlib/backends/meson.build\r\n@@ -19,6 +19,7 @@ python_sources = [\r\n 'backend_qt.py',\r\n 'backend_qtagg.py',\r\n 'backend_qtcairo.py',\r\n+ 'backend_qtpgfpng.py',\r\n 'backend_qt5.py',\r\n 'backend_qt5agg.py',\r\n 'backend_qt5cairo.py',\r\ndiff --git c/lib/matplotlib/backends/registry.py i/lib/matplotlib/backends/registry.py\r\nindex 484d6ed5f2..ac18cc28c9 100644\r\n--- c/lib/matplotlib/backends/registry.py\r\n+++ i/lib/matplotlib/backends/registry.py\r\n@@ -32,7 +32,7 @@ class BackendRegistry:\r\n \"GTK3Agg\", \"GTK3Cairo\", \"GTK4Agg\", \"GTK4Cairo\",\r\n \"MacOSX\",\r\n \"nbAgg\",\r\n- \"QtAgg\", \"QtCairo\", \"Qt5Agg\", \"Qt5Cairo\",\r\n+ \"QtAgg\", \"QtCairo\", \"QtPgfPng\", \"Qt5Agg\", \"Qt5Cairo\",\r\n \"TkAgg\", \"TkCairo\",\r\n \"WebAgg\",\r\n \"WX\", \"WXAgg\", \"WXCairo\",\r\n```\r\n\r\n(https://github.com/matplotlib/matplotlib/pull/27913#issuecomment-1999230861 is also relevant)","author":{"url":"https://github.com/anntzer","@type":"Person","name":"anntzer"},"datePublished":"2024-04-16T16:25:35.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":9},"url":"https://github.com/28086/matplotlib/issues/28086"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:e061efe1-5744-b94a-0301-6f8739d308c6 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | C00C:1C3DD7:1647D61:1DCAF4C:6A52B4D9 |
| html-safe-nonce | 9945826b902a5d0c0894ca336b7c8ff199b50b9e613622be3c12349b0a136c96 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDMDBDOjFDM0RENzoxNjQ3RDYxOjFEQ0FGNEM6NkE1MkI0RDkiLCJ2aXNpdG9yX2lkIjoiMzYzMDI4OTE1NDE3MTEyMjkwNSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 19ad80d9cca812bffba346b350bb975d6aced1d9dee6c2f1bbdbe353b331b58a |
| hovercard-subject-tag | issue:2246453987 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/28086/issue_layout |
| twitter:image | https://opengraph.githubassets.com/ffff4f3d6260a2c685048caa1b5d80ddde75b9de447c35b338afdf217f6b308e/matplotlib/matplotlib/issues/28086 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/ffff4f3d6260a2c685048caa1b5d80ddde75b9de447c35b338afdf217f6b308e/matplotlib/matplotlib/issues/28086 |
| og:image:alt | Problem Per #28084 and a few other older similar issues, some users are confused because they cannot see pgf-generated plots (which can include xelatex/lualatex-specific latex constructs, in partic... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | anntzer |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 07a982c1d40157c619b364352b704c3ce66bb332 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width