Individually labeled bars for bar graph in Plotly

2024/11/15 22:02:15

I was trying to create annotations for grouped bar charts - where each bar has a specific data label that shows the value of that bar and is located above the centre of the bar.

I tried a simple modification of the examples in tutorial to achieve this, as follows:

import plotly.plotly as py
import plotly.graph_objs as gox = ['Product A', 'Product B', 'Product C']
y1 = [20, 14, 23]
y2 = [12, 18, 29]annotations1 = [dict(x=xi,y=yi,text=str(yi),xanchor='auto',yanchor='bottom',showarrow=False,) for xi, yi in zip(x, y1)]
annotations2 = [dict(x=xi,y=yi,text=str(yi),xanchor='auto',yanchor='bottom',showarrow=False,) for xi, yi in zip(x, y2)]
annotations = annotations1 + annotations2trace1 = go.Bar(x=x,y=y1,name='SF Zoo'
)
trace2 = go.Bar(x=x,y=y2,name='LA Zoo'
)
data = [trace1, trace2]
layout = go.Layout(barmode='group',annotations=annotations
)
fig = go.Figure(data=data, layout=layout)
plot_url = py.plot(fig, filename='stacked-bar')

Which produces this plot: https://plot.ly/~ashish.baghudana/49.embed Example Image

However,the data labels are not centred over individual bars, but over the centre of each group of bars. I was wondering if there is a workaround to this, rather than annotating manually.

Answer

This is slightly hackish, but it gets the job done.

x = ['Product A', 'Product B', 'Product C']
y1 = [20, 14, 23]
y2 = [12, 18, 29]xcoord = [0,1,2]annotations1 = [dict(x=xi-0.2,y=yi,text=str(yi),xanchor='auto',yanchor='bottom',showarrow=False,) for xi, yi in zip(xcoord, y1)]annotations2 = [dict(x=xi+0.2,y=yi,text=str(yi),xanchor='auto',yanchor='bottom',showarrow=False,) for xi, yi in zip(xcoord, y2)]annotations = annotations1 + annotations2

Barchart

https://en.xdnf.cn/q/71652.html

Related Q&A

Is there a way to subclass a generator in Python 3?

Aside from the obvious, I thought Id try this, just in case:def somegen(input=None):...yield...gentype = type(somegen()) class subgen(gentype):def best_function_ever():...Alas, Pythons response was qui…

represent binary search trees in python

how do i represent binary search trees in python?

Python os.path.commonprefix - is there a path oriented function?

So I have this python code:print os.path.commonprefix([rC:\root\dir,rC:\root\dir1])Real ResultC:\root\dirDesired resultC:\rootQuestion 1Based on os.path.commonprefix documentation: Return the longest p…

Importing Stripe into Django - NameError

I cant seem to figure out how to import Stripe into my Django project. Im running Python 2.7.3 and I keep receiving NameError at /complete/ global name. stripe is not defined.Even when I just open up T…

getting line-numbers that were changed

Given two text files A,B, what is an easy way to get the line numbers of lines in B not present in A? I see theres difflib, but dont see an interface for retrieving line numbers

How to subclass a subclass of numpy.ndarray

Im struggling to subclass my own subclass of numpy.ndarray. I dont really understand what the problem is and would like someone to explain what goes wrong in the following cases and how to do what Im t…

How to ignore an invalid SSL certificate with requests_html?

So basically Im trying to scrap the javascript generated data from a website. To do this, Im using the Python library requests_html. Here is my code :from requests_html import HTMLSession session = HTM…

Fabric asks for root password

I am using Fabric to run the following:def staging():""" use staging environment on remote host"""env.user = ubuntuenv.environment = stagingenv.hosts = [host.dev]_setup_pa…

Beautifulsoup results to pandas dataframe

The below code returns me a table with the following resultsr = requests.get(url) soup = bs4.BeautifulSoup(r.text, lxml)mylist = soup.find(attrs={class: table_grey_border}) print(mylist)results - it st…

XGBoost CV and best iteration

I am using XGBoost cv to find the optimal number of rounds for my model. I would be very grateful if someone could confirm (or refute), the optimal number of rounds is: estop = 40res = xgb.cv(params, d…