Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Grouped bar charts do not work with multiple Y axes #78

Closed
iustin opened this issue Dec 5, 2015 · 35 comments
Closed

Grouped bar charts do not work with multiple Y axes #78

iustin opened this issue Dec 5, 2015 · 35 comments
Labels
feature something new

Comments

@iustin
Copy link

iustin commented Dec 5, 2015

Hi,

it seems that having a graph with group bar charts and multiple Y axis doesn't work. I've created the trivial graph https://plot.ly/~iustin/4/grouped-bar-chart-with-multiple-axes/ and tested that switching Col3 between yaxis and yaxis2 also toggles between grouped and non-grouped.

Is this intended? Logically speaking, it makes sense to be able to do this, so I guess it's only a technical limitation.

@iustin iustin changed the title Group bar charts do not work with multiple Y axes Grouped bar charts do not work with multiple Y axes Dec 5, 2015
@iustin
Copy link
Author

iustin commented Dec 5, 2015

Note: I used the above link just to show the issue; what I'm interested is to have this working in the JavaScript library.

@alexcjohnson
Copy link
Collaborator

Thanks @iustin - yes, we should be able to support that.

The rule (I think) should be: group bar traces that are on the same position axis, and on the same or overlaying the same size axis.

@etpinard etpinard added the feature something new label Dec 7, 2015
@dprice60
Copy link

dprice60 commented Jan 4, 2016

+1

Right now I am just using overlayed charts with a high alpha on each bar so that I can see through the overlay.

@mbonaci
Copy link
Contributor

mbonaci commented Jan 26, 2016

@dprice60 (or anyone else) could you upload an example of this workaround?
Thanks

@dprice60
Copy link

@mbonaci Here is a simple one using the original example: https://plot.ly/~dprice60/0/grouped-bar-chart-with-multiple-axes/

That's all I have time to do right now, if you need me to do more I can try and put together something better later (like in a couple of days). The interface doesn't allow me to do everything that I normally have been doing but it let me get something up quick. If you click the code tab, I usually would replace the rgb(r,g,b) values with rgba(r,g,b,a). For the main color I've been using an alpha of .5 and for the stroke lines an alpha of 1. That helps make it more obvious that they are overlaying charts instead of stacked charts.

Hope that helps.

@mbonaci
Copy link
Contributor

mbonaci commented Jan 26, 2016

Thanks for that @dprice60, but that looks to me like the stacked type.
I expected from the grouped type that bars that have the same x value are positioned at y=0 and that there's a gap between such groups of different x value.

Something like this:
image

Which is exactly what happens when I remove the second, y2 axis:
https://plot.ly/~mbonaci/24/grouped-bar-chart-with-multiple-axes

@dprice60
Copy link

I don't have a way to do grouped bar charts with multiple y axes. That is why I +1 one'd the issue and said what I'm doing in the meantime in case it helped anyone until a workaround is found. Sorry for the confusion @mbonaci. Like I said my intent was just to show how I am still making bar charts with multiple axes useful until the issue is resolved.

@mbonaci
Copy link
Contributor

mbonaci commented Jan 26, 2016

No, that's ok, I misunderstood your comment, or maybe was just hoping that you have a workaround :)
👍

@alexcjohnson
Copy link
Collaborator

A hack that can get the effect you want is to make dummy traces with one point each and zero value, in place of each trace on the other y axis. So for example, if you want the first trace on y and the second on y2, make 4 traces:

Plotly.newPlot(div, [
    // real trace on the left y axis
    {x:[1,2,3,4], y:[1,2,3,4], type: 'bar'},
    // invisible second trace in the first group
    {x:[1], y: [0], type: 'bar', hoverinfo: 'none', showlegend: false},
    // invisible first trace in the second group
    {x:[1], y: [0], type: 'bar', yaxis: 'y2', hoverinfo: 'none', showlegend: false},
    // real trace on the right y axis
    {x:[1,2,3,4], y:[40,30,20,10], type: 'bar', yaxis: 'y2'}
],
{
    yaxis2: {side: 'right', overlaying: 'y'}
});

Be warned though that once this issue is fixed, plots using this hack will break - this plot would then show up as a single group of 4 traces, two of which are invisible but still get space allotted to them.

@mbonaci
Copy link
Contributor

mbonaci commented Jan 28, 2016

Thanks @alexcjohnson, that was really helpful.
Just to clarify for others, since it's not trivial to deduce from only 2 traces, here's an example with 3:

Plotly.newPlot(placeholder, [
    // real trace on the left y axis
    {x:[1,2,3,4], y:[1,2,3,4], type: 'bar'},
    // invisible to make space for trace aligned to y2
    {x:[1], y: [0], type: 'bar', hoverinfo: 'none', showlegend: false, yaxis: 'y2'},

    // real trace on the left y axis
    {x:[1,2,3,4], y:[4,3,2,1], type: 'bar'},
    // invisible to make space for trace aligned to y2
    {x:[1], y: [0], type: 'bar', hoverinfo: 'none', showlegend: false, yaxis: 'y2'},

    // invisible to make space for trace aligned to y
    {x:[1], y: [0], type: 'bar', hoverinfo: 'none', showlegend: false},
    // real trace on the right, y2 axis
    {x:[1,2,3,4], y:[140,100,100,160], type: 'bar', yaxis: 'y2'}
  ], 
  {
    yaxis2: {side: 'right', overlaying: 'y'}
  }
);

Codepen: https://codepen.io/etpinard/pen/yGrEKp

@ngarcial

This comment has been minimized.

@eagor
Copy link

eagor commented Jun 15, 2016

is there similar trick to have multiple xaxis?
I need the grey bar below be positioned independently from green bars.
image

@allanelder

This comment has been minimized.

@etpinard

This comment has been minimized.

@daftster
Copy link

Hi,

I tried @mbonaci and @alexcjohnson suggestion and it works for vertical chart. I want to try to make it work with horizontal bar charts and replaced x with y and vise versa, but it does not work. Any thoughts on this?

@SirExpie

This comment has been minimized.

@etpinard

This comment has been minimized.

@marcinwojciechowski

This comment has been minimized.

@real-np
Copy link

real-np commented Feb 1, 2018

This is my workaround with 2 series and 2 categories. Adjusting opacity only made it look like stacked so I changed the width as well.

screen shot 2018-02-01 at 23 31 20

For me, it really depends on the data to come up with the workaround though. I'd change those narrow bars to lines or some subtle marks if I feel it would represent the relationship between 2 series better.

screen shot 2018-02-01 at 23 42 38

Having said, I still need to have the grouped bars with 2 axes in some cases.

@seriph
Copy link

seriph commented Apr 19, 2018

@real-np could you explain how you got the bars to appear side-by-side instead of overlayed directly on top of eachother?

@tadejmagajna

This comment has been minimized.

@farahat80

This comment has been minimized.

@majorrabbit
Copy link

majorrabbit commented Jun 19, 2018

+1
Workaround looks off (the hidden data still shows kind of and shifts the sizing of things), box plot has the same issue. Grouping and multiple y axes could be accommodated in overlay mode for box types if explicit width and offset were available as they are for bar types.

@agtere

This comment has been minimized.

@XianjingFan
Copy link

The code below would be a workaround if you really need grouped bar charts with multiple axes. Here trace2 stacks on trace 0, trace 3 stacks on trace 1.

trace0 = go.Bar(x = ['a','b','c'], y=[10,20,30])
trace1 = go.Bar(x = ['a','b','c'], y=[0],showlegend=False,hoverinfo='none')
trace2 = go.Bar(x = ['a','b','c'], y=[0], yaxis='y2',showlegend=False,hoverinfo='none') 
trace3 = go.Bar(x = ['a','b','c'], y=[30,35,60], yaxis='y2') 
data = [trace0,trace1,trace2,trace3]#,trace2
layout = go.Layout(barmode='group',
                   legend=dict(x=0, y=1.1,orientation="h"),
                   yaxis=dict(title='2017 Increase(%)'),
                   yaxis2=dict(title = 'Transaction Count 2016(AUD)',
                               overlaying = 'y',
                               side='right'))
fig = go.Figure(data=data, layout=layout)
offline.iplot(fig)

@dvillagra

This comment has been minimized.

@jwmann

This comment has been minimized.

@etpinard
Copy link
Contributor

PR #3529 introduced (set to be released in v1.45.0) will introduced a way around to default behavior using a new bar attribute: offsetgroup.

See https://codepen.io/etpinard/pen/yZQYzq?editors=1010 for an example.

@ThibTrip
Copy link

PR #3529 introduced (set to be released in v1.45.0) will introduced a way around to default behavior using a new bar attribute: offsetgroup.

See https://codepen.io/etpinard/pen/yZQYzq?editors=1010 for an example.

Hi etpinard,

is it intended that the yaxis and yaxis2 grids are not aligned? I thought {"anchor":"x"} was doing that. I also have unaligned grid axis with an horizontal bar chart I made (see below, sorry did not make it with codepen):


{'data': [{'name': 'some_metric',
   'offsetgroup': '0',
   'orientation': 'h',
   'x': array([0.61354582, 0.33720317]),
   'xaxis': 'x',
   'y': ['orangoutans', 'chimpanzee'],
   'type': 'bar',
   'uid': 'fe706d20-fccc-427c-8931-760de1217db7'},
  {'name': 'another_metric',
   'offsetgroup': '1',
   'orientation': 'h',
   'x': array([0.61354582, 0.04379947]),
   'xaxis': 'x',
   'y': ['orangoutans', 'chimpanzee'],
   'type': 'bar',
   'uid': '5cb8bafe-c455-4df3-ad9e-445b81f68682'},
  {'name': 'yet_another_metric',
   'offsetgroup': '2',
   'orientation': 'h',
   'x': array([0.00398406, 0.01002639]),
   'xaxis': 'x',
   'y': ['orangoutans', 'chimpanzee'],
   'type': 'bar',
   'uid': 'fc5e2de7-aa67-4df5-8f0b-03c748f7bb2e'},
  {'marker': {'color': '#7f8793'},
   'name': 'some_metric_on_other_axis',
   'offsetgroup': '3',
   'orientation': 'h',
   'x': array([ 251, 1895], dtype=int64),
   'xaxis': 'x2',
   'y': ['orangoutans', 'chimpanzee'],
   'type': 'bar',
   'uid': '73351dfa-03d7-499e-afe4-ff4f9f851f14'}],
 'layout': {'bargap': 0,
  'bargroupgap': 0,
  'height': 100,
  'margin': {'autoexpand': True, 'l': 325.5, 'pad': 10},
  'title': {'text': 'Dual axis horizontal'},
  'xaxis': {'anchor': 'y',
   'automargin': True,
   'overlaying': 'x2',
   'side': 'top'},
  'xaxis2': {'anchor': 'y', 'automargin': True, 'side': 'bottom'}}}

2019-04-15 20_31_21-JupyterLab

@etpinard
Copy link
Contributor

@ThibTrip please use https://community.plot.ly/c/plotly-js for questions of the likes. Thank you!

@archmoj
Copy link
Contributor

archmoj commented Aug 31, 2020

@etpinard's demo using latest plotly.js seems to be working fine. Wondering if that workaround is enough to close this issue?

@nicolaskruchten
Copy link
Contributor

@archmoj for that specific case it's working OK, but if you e.g. omit orangutans from the second trace, they overlap weirdly again.

@jackparmer
Copy link
Contributor

This issue has been tagged with NEEDS SPON$OR

A community PR for this feature would certainly be welcome, but our experience is deeper features like this are difficult to complete without the Plotly maintainers leading the effort.

Sponsorship range: $10k-$15k

What Sponsorship includes:

  • Completion of this feature to the Sponsor's satisfaction, in a manner coherent with the rest of the Plotly.js library and API
  • Tests for this feature
  • Long-term support (continued support of this feature in the latest version of Plotly.js)
  • Documentation at plotly.com/javascript
  • Possibility of integrating this feature with Plotly Graphing Libraries (Python, R, F#, Julia, MATLAB, etc)
  • Possibility of integrating this feature with Dash
  • Feature announcement on community.plotly.com with shout out to Sponsor (or can remain anonymous)
  • Gratification of advancing the world's most downloaded, interactive scientific graphing libraries (>50M downloads across supported languages)

Please include the link to this issue when contacting us to discuss.

@koniro6pm
Copy link

@real-np Hi, I have tried and looked up for many methods to plot such figure, but I still can't overlay two grouped barchart. Can you explain how you do it? Many thanks.

@gvwilson
Copy link
Contributor

gvwilson commented Jun 5, 2024

Hi - this issue has been sitting for a while, so as part of our effort to tidy up our public repositories I'm going to close it. If it's still a concern, we'd be grateful if you could open a new issue (with a short reproducible example if appropriate) so that we can add it to our stack. Cheers - @gvwilson

@gvwilson gvwilson closed this as completed Jun 5, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature something new
Projects
None yet
Development

No branches or pull requests