Reputation: 33
Image of What I want to create
I got the left hand side of the graph (Top Third), and tried creating a 'bars2' and 'text2' field but that didn't work and adding it into the original ranked_movies field but that was all messy. Is there a way to shift and compress and maybe add a whole other set of bar charts?
tuples = list(zip([names[ep] for ep in episodes],topthird,middlethird))
binranking_per_df = pd.DataFrame(tuples, columns = ['Name', 'Top Third','Middle Third'])
#ranking_per_df
bars = alt.Chart(binranking_per_df).mark_bar(size=20).encode(
x=alt.X(
'Top Third',
axis=None),
y=alt.Y(
'Name:N',
axis=alt.Axis(tickCount=5, title=''),
sort=names_l
)
)
bars2 = alt.Chart(binranking_per_df).mark_bar(size=20).encode(
x=alt.X(
'Middle Third',
axis=None),
y=alt.Y(
'Name:N',
axis=alt.Axis(tickCount=5, title=''),
sort=names_l
)
)
text = bars.mark_text(
align='left',
baseline='middle',
dx=3
).encode(
text=alt.Text('Top Third:Q',format='.0%')
)
text2 = bars.mark_text(
align='left',
baseline='middle',
dx=3
).encode(
text=alt.Text('Middle Third:Q',format='.0%')
)
ranked_movies = (text + bars).configure_mark(
color='#008fd5'
).configure_view(
strokeWidth=0
).configure_scale(
bandPaddingInner=0.2
).properties(
width=500,
height=180
).properties(
title="Whats the Best 'Star Wars' Movie?"
)
Upvotes: 3
Views: 537
Reputation: 86310
This question (about the identical chart) was previously answered here, but unfortunately the question was deleted by the user.
Here was my response:
The Altair gallery has a few examples of faceted bar charts (e.g. this one) For the chart you have in mind, you can proceed by faceting a Layer Chart which contains a bar and a text layer. For example:
import altair as alt
import numpy as np
import pandas as pd
titles = ['The Phantom Menace', 'Attack of the Clones', 'Revenge of the Sith',
'A New Hope', 'The Empire Strikes Back', 'Return of the Jedi']
categories = ['Top third', 'Middle third', 'Bottom third']
percentages = [
[0.16, 0.14, 0.13, 0.50, 0.64, 0.43],
[0.37, 0.29, 0.40, 0.31, 0.22, 0.41],
[0.46, 0.57, 0.47, 0.19, 0.14, 0.17]
]
titles, categories, percentages = map(
np.ravel, np.broadcast_arrays(
titles, np.array(categories)[:, None], percentages))
df = pd.DataFrame({
'titles': titles,
'categories': categories,
'percentages': percentages,
})
base = alt.Chart(df).encode(
x=alt.X('percentages:Q', axis=None),
y=alt.Y('titles:N', title=None, sort=titles),
).properties(
width=70
)
bars = base.mark_bar().encode(
color=alt.Color('categories:N', legend=None)
)
text = base.mark_text(dx=15).encode(
text=alt.Text('percentages:Q', format=".0%")
)
(bars + text).facet(
column=alt.Column('categories:N', title=None, sort=categories)
).configure_view(
stroke='transparent'
)
Upvotes: 5