From 364782161df02e3a659d73566d9c05aaffdf2289 Mon Sep 17 00:00:00 2001 From: Sam Rich Date: Tue, 25 Feb 2020 11:52:09 -0500 Subject: [PATCH 1/5] blog post WIP add myself to authors add random pic for myself updates proofreading my post add links to tags in post template add tags to blog page change thumbnail for my post single quotes in JS --- _data/authors.yml | 22 ++- _includes/_article_preview.html | 11 ++ _layouts/post.html | 2 +- .../2020-02-23-custom-react-plotly.md | 187 ++++++++++++++++++ _sass/components/blog_post.scss | 2 +- _sass/components/blog_teaser.scss | 10 + images/avatars/sam_rich.svg | 1 + images/sam_rich/plotly/thumbnail.png | Bin 0 -> 65037 bytes 8 files changed, 226 insertions(+), 9 deletions(-) create mode 100644 _posts/sam_rich/2020-02-23-custom-react-plotly.md create mode 100644 images/avatars/sam_rich.svg create mode 100644 images/sam_rich/plotly/thumbnail.png diff --git a/_data/authors.yml b/_data/authors.yml index 8c92afc2..87ee1c2c 100755 --- a/_data/authors.yml +++ b/_data/authors.yml @@ -140,12 +140,12 @@ rosi_bajari: avatar: rosi_bajari.png github: rosibaj -touhidul_mridha: - name: Touhidul Mridha - position: Technical Business Analyst - info: Business Analyst with science and technology background. Has a passion for requirements elicitation, problem solving, solution proposals, board games, health and fitness. - avatar: touhidul_mridha.png - github: touhidulmridha +sam_rich: + name: Sam Rich + position: Software Developer + info: Front end developer & staunch advocate for bringing your dog to work. + avatar: sam_rich.svg + github: samrichca xu_deng: name: Xu Deng @@ -298,6 +298,14 @@ sid_joshi: github: sidsyrus is_alumni: true +touhidul_mridha: + name: Touhidul Mridha + position: Technical Business Analyst + info: Business Analyst with science and technology background. Has a passion for requirements elicitation, problem solving, solution proposals, board games, health and fitness. + avatar: touhidul_mridha.png + github: touhidulmridha + is_alumni: true + vitalii_slobodianyk: name: Vitalii Slobodianyk position: Software Developer @@ -312,4 +320,4 @@ vincent_ferretti: info: Principal Investigator, team leader, revered monarch. Lead his teams in delivering high-quality infrastructure and software solutions used by cancer researchers worldwide. Detailed oriented, result focused, asks for nothing less than excellence. Rocks and trees are the perfect source of inspiration for software names. avatar: vincent_ferretti.svg github: vferretti - is_alumni: true + is_alumni: true \ No newline at end of file diff --git a/_includes/_article_preview.html b/_includes/_article_preview.html index 48a83af5..0c5781a0 100644 --- a/_includes/_article_preview.html +++ b/_includes/_article_preview.html @@ -83,4 +83,15 @@

{{ include.post.title }}

{% endfor %} --> +
+ + + {% for tag in post.tags %} + {{ tag }} + {% unless forloop.last %} + / + {% endunless %} + {% endfor %} + +
diff --git a/_layouts/post.html b/_layouts/post.html index 86d81045..a6fefbf3 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -32,7 +32,7 @@

{{ page.title }}

{% for tag in page.tags %} - {{ tag }} + {{ tag }} {% unless forloop.last %} / {% endunless %} diff --git a/_posts/sam_rich/2020-02-23-custom-react-plotly.md b/_posts/sam_rich/2020-02-23-custom-react-plotly.md new file mode 100644 index 00000000..b27acf50 --- /dev/null +++ b/_posts/sam_rich/2020-02-23-custom-react-plotly.md @@ -0,0 +1,187 @@ +--- +layout: post +title: "How to Customize the Toolbar in React-Plotly.js" +breadcrumb: true +author: sam_rich +date: 2020-02-23 +categories: sam_rich +tags: + - JavaScript + - GDC Portal + - Visualization + - React +teaser: + info: Using Plotly.js's built-in methods to make a bigger, better toolbar. + image: sam_rich/plotly/thumbnail.png +header: + version: small + title: Software Engineering Blog + image: header-logo-crop.png + icon: icon-blog +--- + +[Plotly.js](https://plot.ly/javascript/) is an open-source data visualization tool that you can embed in your web application. There's also a React version that requires Plotly.js as a dependency: [React-Plotly.js](https://plot.ly/javascript/react/). + +Plotly.js includes a toolbar or "modebar" that, by default, is visible when you hover over a plot. There are various [configuration options](https://plot.ly/javascript/configuration-options/#force-the-modebar-to-always-be-visible), but none for changing the appearance or positioning of the buttons. + +We wanted to change how the toolbar looks, to make it consistent with the rest of the [GDC Portal](https://portal.gdc.cancer.gov/). Plotly.js doesn't give you this option out of the box. If you want to change how the modebar looks, that means making a whole new toolbar, and remotely or programmatically invoking Plotly.js functionality from elsewhere in the app. + +## How to make your own modebar + +First, you have to [customize the Plotly.js bundle](https://github.com/plotly/React-Plotly.js#customizing-the-plotlyjs-bundle), which is as simple as changing how you import the packages. + +By default, React-Plotly.js loads Plotly.js and creates a `` element. You can create `` on your own for more customization. + +```js +// default implementation +import Plot from 'React-Plotly.js'; + +// custom bundle implementation +import Plotly from 'plotly.js'; +import createPlotlyComponent from 'React-Plotly.js/factory'; + +const Plot = createPlotlyComponent(Plotly); +``` + +You can also use this opportunity to import a [partial bundle](https://github.com/plotly/plotly.js/blob/master/dist/README.md#partial-bundles). By default, React-Plotly.js loads Plotly.js, which is quite heavy, at 2mb minified. For this example we'll use the [basic partial bundle](https://github.com/plotly/plotly.js/blob/master/dist/README.md#plotlyjs-basic), which is 853kb minified. + +```js +import Plotly from 'plotly.js/lib/index-basic'; +``` + +Next, modifying the `` element. Use [Plotly.js's `onInitialized` method](https://github.com/plotly/React-Plotly.js/#basic-props) to get the `graphDiv` (the DOM node where the plot is displayed). + +```js +export default class CustomPlotlyModeBar extends React.Component { + state = { graphDiv: null }; + + onInitialized = (figure, graphDiv) => { + this.setState({ graphDiv }); + }; + + render() { + return ( + <> + {/* quickstart example from React-Plotly.js */} + + + ); + } +} +``` + +Next, import the `ModeBarButtons` object: + +```js +import ModeBarButtons from 'plotly.js/src/components/modebar/buttons'; +``` + +Referring to the [the source code for modebar buttons](https://github.com/plotly/plotly.js/blob/master/src/components/modebar/buttons.js), make new buttons with the required `data` attributes: + +```js + +``` + +Add a click handler above the `render()` function in the class: + +```js +handleButtonClick = e => { + const { graphDiv } = this.state; + e.persist(); + const name = e.target.getAttribute('data-name'); + ModeBarButtons[name].click(graphDiv, e); +}; +``` + +Let's break this down: + +- `e.persist()` allows you to use the event's properties asynchronously. In React, you should store event properties in a variable if you want to use them, or they may be nullified to free up memory. If you want to preserve the entire event, as we do here, use `e.persist()`. (See: [Synthetic Events in React](https://reactjs.org/docs/events.html)) +- The buttons in `ModeBarButtons` all have `click` methods that take specific arguments - usually the arguments are `graphDiv` and the click event. + +Voila! You should be able to zoom in and out using these buttons. This can be replicated for any existing buttons in Plotly. + +## Next steps: Using Plotly.js methods to make new buttons + +Besides copying existing Plotly.js buttons, we can also tap into other functionality. + +By default, Plotly's `toImage` modebar button only offers downloads in a single image format. Thankfully, `downloadImage()` is [exposed as a Plotly.js method](https://github.com/plotly/plotly.js/blob/master/src/components/modebar/buttons.js#L73). + +Here are buttons for downloading PNG and SVG images: + +```js + + +``` + +Lastly, the click handler needs to be updated to call `Plotly.downloadImage()` and pass in options. + +```js +handleButtonClick = e => { + const { graphDiv } = this.state; + e.persist(); + const name = e.target.getAttribute('data-name'); + if (name === 'downloadImage') { + const format = e.target.getAttribute('data-format'); + const scale = e.target.getAttribute('data-scale'); + Plotly.downloadImage(graphDiv, { format, scale }) + } else { + ModeBarButtons[name].click(graphDiv, e); + } +}; +``` + +## Demo + + + +## Links + +- [React-Plotly.js homepage](https://plot.ly/javascript/react/) +- Plotly forums: [How to trigger a Modebar action from somewhere else?](https://community.plot.ly/t/how-to-trigger-a-modebar-action-from-somewhere-else/2663/12) +- Plotly forums: [Save as .svg instead of .png in modeBar](https://community.plot.ly/t/save-as-svg-instead-of-png-in-modebar/4560) + +## Conclusion + +If you want to change the look and feel of React-Plotly.js's modebar, you have to make a new modebar and programmatically access Plotly.js's button methods. In the process, you can also make new buttons, and reduce Plotly.js's hefty footprint by using a partial bundle. \ No newline at end of file diff --git a/_sass/components/blog_post.scss b/_sass/components/blog_post.scss index bbb97f3d..41b88c08 100644 --- a/_sass/components/blog_post.scss +++ b/_sass/components/blog_post.scss @@ -135,7 +135,7 @@ color: rgba(0,0,0,0.8); } - .post-tags { + .post-tags * { margin-bottom: 1.25rem; color: #7fa5d2; } diff --git a/_sass/components/blog_teaser.scss b/_sass/components/blog_teaser.scss index c2e2211f..47fa7b4d 100644 --- a/_sass/components/blog_teaser.scss +++ b/_sass/components/blog_teaser.scss @@ -46,6 +46,16 @@ margin-bottom: 0; font-size: 14px; } + .post-tags { + margin-top: 15px; + * { + font-size: 12px; + color: #7fa5d2; + } + a:hover { + border-bottom: 2px solid; + } + } .author { display: flex; flex-direction: row; diff --git a/images/avatars/sam_rich.svg b/images/avatars/sam_rich.svg new file mode 100644 index 00000000..fd997a1f --- /dev/null +++ b/images/avatars/sam_rich.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/sam_rich/plotly/thumbnail.png b/images/sam_rich/plotly/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..b15053b2dde6a5aac848f2c45f5dbe6156b1a111 GIT binary patch literal 65037 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 nVyb#F;`)mJ75)GHBRUZcJwedCjC-vD0zR^mN)i Date: Tue, 25 Feb 2020 12:07:36 -0500 Subject: [PATCH 2/5] toolbar --> modebar --- _posts/sam_rich/2020-02-23-custom-react-plotly.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/sam_rich/2020-02-23-custom-react-plotly.md b/_posts/sam_rich/2020-02-23-custom-react-plotly.md index b27acf50..1b851f34 100644 --- a/_posts/sam_rich/2020-02-23-custom-react-plotly.md +++ b/_posts/sam_rich/2020-02-23-custom-react-plotly.md @@ -1,6 +1,6 @@ --- layout: post -title: "How to Customize the Toolbar in React-Plotly.js" +title: "How to Customize the Modebar in React-Plotly.js" breadcrumb: true author: sam_rich date: 2020-02-23 From a91406e967286a21ae82a9543f3c6ddf4a0adf44 Mon Sep 17 00:00:00 2001 From: Sam Rich Date: Tue, 25 Feb 2020 12:12:44 -0500 Subject: [PATCH 3/5] reduce line height in blog post tags --- _sass/components/blog_teaser.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/_sass/components/blog_teaser.scss b/_sass/components/blog_teaser.scss index 47fa7b4d..0b7f6f7b 100644 --- a/_sass/components/blog_teaser.scss +++ b/_sass/components/blog_teaser.scss @@ -48,6 +48,7 @@ } .post-tags { margin-top: 15px; + line-height: 1.25; * { font-size: 12px; color: #7fa5d2; From ea55a6579f79382b0c1891e2af1c96e6cddc657e Mon Sep 17 00:00:00 2001 From: Sam Rich Date: Tue, 28 Apr 2020 16:33:51 -0400 Subject: [PATCH 4/5] WIP add reset button --- .../2020-02-23-custom-react-plotly.md | 74 ++++++++++++++----- 1 file changed, 56 insertions(+), 18 deletions(-) diff --git a/_posts/sam_rich/2020-02-23-custom-react-plotly.md b/_posts/sam_rich/2020-02-23-custom-react-plotly.md index 1b851f34..6e6384d6 100644 --- a/_posts/sam_rich/2020-02-23-custom-react-plotly.md +++ b/_posts/sam_rich/2020-02-23-custom-react-plotly.md @@ -52,6 +52,29 @@ import Plotly from 'plotly.js/lib/index-basic'; Next, modifying the `` element. Use [Plotly.js's `onInitialized` method](https://github.com/plotly/React-Plotly.js/#basic-props) to get the `graphDiv` (the DOM node where the plot is displayed). ```js +// hiding the modebar in this example +const config = { + displayModeBar: false, + showlogo: false, +}; + +const data = [ + { + x: [1, 2, 3], + y: [2, 6, 3], + type: 'scatter', + mode: 'lines+markers', + marker: { color: 'red' } + }, + { type: 'bar', x: [1, 2, 3], y: [2, 5, 3] } +]; + +const layout = { + width: 320, + height: 240, + title: 'A Fancy Plot', +}; + export default class CustomPlotlyModeBar extends React.Component { state = { graphDiv: null }; @@ -64,19 +87,9 @@ export default class CustomPlotlyModeBar extends React.Component { <> {/* quickstart example from React-Plotly.js */} @@ -124,9 +137,11 @@ Voila! You should be able to zoom in and out using these buttons. This can be re ## Next steps: Using Plotly.js methods to make new buttons -Besides copying existing Plotly.js buttons, we can also tap into other functionality. +Besides copying existing Plotly.js buttons, we can also tap into other functionality: in this case, using Plotly.js methods to make custom buttons for download and reset. + +### Download button -By default, Plotly's `toImage` modebar button only offers downloads in a single image format. Thankfully, `downloadImage()` is [exposed as a Plotly.js method](https://github.com/plotly/plotly.js/blob/master/src/components/modebar/buttons.js#L73). +In Plotly.js's default modebar, the download button is called `toImage`. By default, that button only offers downloads in a single image format. Thankfully, `downloadImage()` is [exposed as a Plotly.js method](https://github.com/plotly/plotly.js/blob/master/src/components/modebar/buttons.js#L73) and we can use it to make download buttons with different options. Here are buttons for downloading PNG and SVG images: @@ -134,7 +149,7 @@ Here are buttons for downloading PNG and SVG images: ``` -Lastly, the click handler needs to be updated to call `Plotly.downloadImage()` and pass in options. +Also, the click handler needs to be updated to call `Plotly.downloadImage()` and pass in options. ```js handleButtonClick = e => { @@ -166,6 +181,29 @@ handleButtonClick = e => { }; ``` +### Reset button + +Plotly.js's default `reset` button only resets the plot axes. There's [a `react` method that will do a hard reset](https://plotly.com/javascript/plotlyjs-function-reference/#plotlyreact) and reload the visualization, but there's no button for it in the standard modebar. + +The button: + +```js + +``` + +Update the `handleButtonClick` handler: + +```js +else if (name === 'react') { + Plotly.react(graphDiv, data, layout); +} +``` + ## Demo