Reputation: 27
Help me with my grouped stacked bar plot. I can't set distances between bar labels in altair.
This is my code
chart = alt.Chart(chain_and_prices_for_bar, title='Распределение средних цен различных ценовых категорий среди аптечных сетей в разрезе страны производства').mark_bar().encode(
x=alt.X('category_of_price:N', stack='zero', sort=['Низкая', 'Ниже среднего', 'Средняя', 'Выше среднего', 'Высокая', 'Самая высокая'], title=None, axis=alt.Axis(labelAngle=-45, labelOverlap=False)),
y=alt.Y('mean_price_of_medicine:Q', axis=alt.Axis(grid=False, title='Суммарная средняя цена'), scale=alt.Scale(domain=[0, 201], bins=[i for i in range(211) if i%10 ==0])),
#column=alt.Column('retail_chain:N', title=None, sort=list_of_top_pharmacies, header=alt.Header(labelFontSize=11, labelFontStyle='bold')),
order=alt.Order(
'is_import', sort='ascending'),
color=alt.Color('is_import:N', scale=alt.Scale(range=['#96ceb4', '#ffcc5c']),
legend=alt.Legend(title='Страна производства'))
).properties(
width=100,
height=600)
#chart = chart.configure_view(strokeOpacity=0)
chart.configure_title(fontSize=18, anchor='middle', align='center', dy=-10)
text = alt.Chart(chain_and_prices_for_bar).mark_text(dx=-1, dy=2, color='black', align='center', baseline='bottom', angle=270).encode(
x=alt.X('category_of_price:N', stack='zero', sort=['Низкая', 'Ниже среднего', 'Средняя', 'Выше среднего', 'Высокая', 'Самая высокая'], title=None, axis=alt.Axis(labelAngle=-45, labelOverlap=False)),
y=alt.Y('mean_price_of_medicine:Q'),
detail='retail_chain:N',
text=alt.Text('mean_price_of_medicine:Q', format='.2f'))
alt.layer(
chart, text, data=chain_and_prices_for_bar).facet(
facet=alt.Column('retail_chain:N', title=None, sort=list_of_top_pharmacies, header=alt.Header(labelFontSize=11, labelFontStyle='bold')),
).configure_view(continuousHeight=200, continuousWidth= 0.5).configure_facet(spacing=0.5)
This is what i got
numbers are overlapping and i need to change it
chain_and_prices_for_bar = pd.DataFrame(my_dict)
list_of_top_pharmacies = ['Гродненское РУП Фармация', 'Альфа-аптека', 'Планета Здоровья', 'Моя Аптека', 'Остров здоровья', 'Биотест', 'Искамед', 'ADEL','Inlek']
my_dict = {'retail_chain': {0: 'ADEL', 34: 'Альфа-аптека', 72: 'Моя Аптека', 36: 'Биотест', 38: 'Биотест', 86: 'Остров здоровья', 40: 'Биотест', 42: 'Биотест', 84: 'Остров здоровья', 44: 'Биотест', 46: 'Биотест', 82: 'Моя Аптека', 48: 'Гродненское РУП Фармация', 50: 'Гродненское РУП Фармация', 80: 'Моя Аптека', 52: 'Гродненское РУП Фармация', 106: 'Планета Здоровья', 54: 'Гродненское РУП Фармация', 56: 'Гродненское РУП Фармация', 78: 'Моя Аптека', 58: 'Гродненское РУП Фармация', 60: 'Искамед', 76: 'Моя Аптека', 62: 'Искамед', 64: 'Искамед', 74: 'Моя Аптека', 66: 'Искамед', 68: 'Искамед', 32: 'Альфа-аптека', 90: 'Остров здоровья', 88: 'Остров здоровья', 98: 'Планета Здоровья', 2: 'ADEL', 104: 'Планета Здоровья', 4: 'ADEL', 6: 'ADEL', 102: 'Планета Здоровья', 8: 'ADEL', 10: 'ADEL', 100: 'Планета Здоровья', 12: 'Inlek', 14: 'Inlek', 30: 'Альфа-аптека', 16: 'Inlek', 18: 'Inlek', 70: 'Искамед', 96: 'Планета Здоровья', 20: 'Inlek', 28: 'Альфа-аптека', 92: 'Остров здоровья', 22: 'Inlek', 94: 'Остров здоровья', 24: 'Альфа-аптека', 26: 'Альфа-аптека', 105: 'Планета Здоровья', 73: 'Моя Аптека', 89: 'Остров здоровья', 75: 'Моя Аптека', 103: 'Планета Здоровья', 93: 'Остров здоровья', 87: 'Остров здоровья', 83: 'Моя Аптека', 101: 'Планета Здоровья', 79: 'Моя Аптека', 99: 'Планета Здоровья', 85: 'Остров здоровья', 95: 'Остров здоровья', 81: 'Моя Аптека', 97: 'Планета Здоровья', 77: 'Моя Аптека', 91: 'Остров здоровья', 53: 'Гродненское РУП Фармация', 69: 'Искамед', 27: 'Альфа-аптека', 25: 'Альфа-аптека', 23: 'Inlek', 21: 'Inlek', 19: 'Inlek', 17: 'Inlek', 29: 'Альфа-аптека', 15: 'Inlek', 11: 'ADEL', 9: 'ADEL', 7: 'ADEL', 5: 'ADEL', 3: 'ADEL', 1: 'ADEL', 13: 'Inlek', 31: 'Альфа-аптека', 33: 'Альфа-аптека', 35: 'Альфа-аптека', 67: 'Искамед', 65: 'Искамед', 63: 'Искамед', 61: 'Искамед', 59: 'Гродненское РУП Фармация', 57: 'Гродненское РУП Фармация', 55: 'Гродненское РУП Фармация', 51: 'Гродненское РУП Фармация', 49: 'Гродненское РУП Фармация', 47: 'Биотест', 45: 'Биотест', 43: 'Биотест', 41: 'Биотест', 39: 'Биотест', 37: 'Биотест', 71: 'Искамед', 107: 'Планета Здоровья'}, 'category_of_price': {0: 'Низкая', 34: 'Самая высокая', 72: 'Низкая', 36: 'Низкая', 38: 'Ниже среднего', 86: 'Ниже среднего', 40: 'Средняя', 42: 'Выше среднего', 84: 'Низкая', 44: 'Высокая', 46: 'Самая высокая', 82: 'Самая высокая', 48: 'Низкая', 50: 'Ниже среднего', 80: 'Высокая', 52: 'Средняя', 106: 'Самая высокая', 54: 'Выше среднего', 56: 'Высокая', 78: 'Выше среднего', 58: 'Самая высокая', 60: 'Низкая', 76: 'Средняя', 62: 'Ниже среднего', 64: 'Средняя', 74: 'Ниже среднего', 66: 'Выше среднего', 68: 'Высокая', 32: 'Высокая', 90: 'Выше среднего', 88: 'Средняя', 98: 'Ниже среднего', 2: 'Ниже среднего', 104: 'Высокая', 4: 'Средняя', 6: 'Выше среднего', 102: 'Выше среднего', 8: 'Высокая', 10: 'Самая высокая', 100: 'Средняя', 12: 'Низкая', 14: 'Ниже среднего', 30: 'Выше среднего', 16: 'Средняя', 18: 'Выше среднего', 70: 'Самая высокая', 96: 'Низкая', 20: 'Высокая', 28: 'Средняя', 92: 'Высокая', 22: 'Самая высокая', 94: 'Самая высокая', 24: 'Низкая', 26: 'Ниже среднего', 105: 'Высокая', 73: 'Низкая', 89: 'Средняя', 75: 'Ниже среднего', 103: 'Выше среднего', 93: 'Высокая', 87: 'Ниже среднего', 83: 'Самая высокая', 101: 'Средняя', 79: 'Выше среднего', 99: 'Ниже среднего', 85: 'Низкая', 95: 'Самая высокая', 81: 'Высокая', 97: 'Низкая', 77: 'Средняя', 91: 'Выше среднего', 53: 'Средняя', 69: 'Высокая', 27: 'Ниже среднего', 25: 'Низкая', 23: 'Самая высокая', 21: 'Высокая', 19: 'Выше среднего', 17: 'Средняя', 29: 'Средняя', 15: 'Ниже среднего', 11: 'Самая высокая', 9: 'Высокая', 7: 'Выше среднего', 5: 'Средняя', 3: 'Ниже среднего', 1: 'Низкая', 13: 'Низкая', 31: 'Выше среднего', 33: 'Высокая', 35: 'Самая высокая', 67: 'Выше среднего', 65: 'Средняя', 63: 'Ниже среднего', 61: 'Низкая', 59: 'Самая высокая', 57: 'Высокая', 55: 'Выше среднего', 51: 'Ниже среднего', 49: 'Низкая', 47: 'Самая высокая', 45: 'Высокая', 43: 'Выше среднего', 41: 'Средняя', 39: 'Ниже среднего', 37: 'Низкая', 71: 'Самая высокая', 107: 'Самая высокая'}, 'is_import': {0: 'Беларусь', 34: 'Беларусь', 72: 'Беларусь', 36: 'Беларусь', 38: 'Беларусь', 86: 'Беларусь', 40: 'Беларусь', 42: 'Беларусь', 84: 'Беларусь', 44: 'Беларусь', 46: 'Беларусь', 82: 'Беларусь', 48: 'Беларусь', 50: 'Беларусь', 80: 'Беларусь', 52: 'Беларусь', 106: 'Беларусь', 54: 'Беларусь', 56: 'Беларусь', 78: 'Беларусь', 58: 'Беларусь', 60: 'Беларусь', 76: 'Беларусь', 62: 'Беларусь', 64: 'Беларусь', 74: 'Беларусь', 66: 'Беларусь', 68: 'Беларусь', 32: 'Беларусь', 90: 'Беларусь', 88: 'Беларусь', 98: 'Беларусь', 2: 'Беларусь', 104: 'Беларусь', 4: 'Беларусь', 6: 'Беларусь', 102: 'Беларусь', 8: 'Беларусь', 10: 'Беларусь', 100: 'Беларусь', 12: 'Беларусь', 14: 'Беларусь', 30: 'Беларусь', 16: 'Беларусь', 18: 'Беларусь', 70: 'Беларусь', 96: 'Беларусь', 20: 'Беларусь', 28: 'Беларусь', 92: 'Беларусь', 22: 'Беларусь', 94: 'Беларусь', 24: 'Беларусь', 26: 'Беларусь', 105: 'Импорт', 73: 'Импорт', 89: 'Импорт', 75: 'Импорт', 103: 'Импорт', 93: 'Импорт', 87: 'Импорт', 83: 'Импорт', 101: 'Импорт', 79: 'Импорт', 99: 'Импорт', 85: 'Импорт', 95: 'Импорт', 81: 'Импорт', 97: 'Импорт', 77: 'Импорт', 91: 'Импорт', 53: 'Импорт', 69: 'Импорт', 27: 'Импорт', 25: 'Импорт', 23: 'Импорт', 21: 'Импорт', 19: 'Импорт', 17: 'Импорт', 29: 'Импорт', 15: 'Импорт', 11: 'Импорт', 9: 'Импорт', 7: 'Импорт', 5: 'Импорт', 3: 'Импорт', 1: 'Импорт', 13: 'Импорт', 31: 'Импорт', 33: 'Импорт', 35: 'Импорт', 67: 'Импорт', 65: 'Импорт', 63: 'Импорт', 61: 'Импорт', 59: 'Импорт', 57: 'Импорт', 55: 'Импорт', 51: 'Импорт', 49: 'Импорт', 47: 'Импорт', 45: 'Импорт', 43: 'Импорт', 41: 'Импорт', 39: 'Импорт', 37: 'Импорт', 71: 'Импорт', 107: 'Импорт'}, 'mean_price_of_medicine': {0: 4.92, 34: 78.74, 72: 5.1, 36: 5.09, 38: 15.15, 86: 14.92, 40: 25.95, 42: 38.38, 84: 5.37, 44: 48.12, 46: 84.02, 82: 83.49, 48: 5.28, 50: 15.13, 80: 49.23, 52: 26.11, 106: 86.08, 54: 38.06, 56: 49.25, 78: 37.33, 58: 83.79, 60: 5.18, 76: 26.22, 62: 15.19, 64: 26.29, 74: 14.81, 66: 38.48, 68: 48.93, 32: 47.22, 90: 38.31, 88: 25.82, 98: 15.17, 2: 15.21, 104: 50.87, 4: 26.52, 6: 38.14, 102: 37.9, 8: 46.43, 10: 89.32, 100: 25.85, 12: 5.14, 14: 15.01, 30: 38.04, 16: 26.16, 18: 38.56, 70: 93.85, 96: 5.06, 20: 47.71, 28: 26.08, 92: 50.44, 22: 88.74, 94: 86.42, 24: 5.29, 26: 14.98, 105: 48.25, 73: 7.21, 89: 26.74, 75: 15.85, 103: 37.83, 93: 49.03, 87: 16.1, 83: 87.7, 101: 26.52, 79: 38.01, 99: 16.33, 85: 7.03, 95: 82.19, 81: 48.59, 97: 7.17, 77: 26.46, 91: 38.22, 53: 26.42, 69: 48.85, 27: 15.86, 25: 7.32, 23: 87.21, 21: 48.81, 19: 38.58, 17: 26.51, 29: 26.55, 15: 16.06, 11: 83.96, 9: 48.56, 7: 38.32, 5: 26.66, 3: 16.1, 1: 7.33, 13: 7.21, 31: 38.03, 33: 48.07, 35: 94.97, 67: 38.34, 65: 26.62, 63: 16.09, 61: 7.22, 59: 95.27, 57: 48.59, 55: 38.14, 51: 16.14, 49: 6.9, 47: 89.96, 45: 48.1, 43: 38.06, 41: 26.7, 39: 16.12, 37: 7.17, 71: 108.55, 107: 86.54}, 'divided_mean_price_of_medicine': {0: 2.46, 34: 39.37, 72: 2.55, 36: 2.54, 38: 7.57, 86: 7.46, 40: 12.98, 42: 19.19, 84: 2.68, 44: 24.06, 46: 42.01, 82: 41.75, 48: 2.64, 50: 7.56, 80: 24.61, 52: 13.05, 106: 43.04, 54: 19.03, 56: 24.62, 78: 18.67, 58: 41.89, 60: 2.59, 76: 13.11, 62: 7.6, 64: 13.15, 74: 7.41, 66: 19.24, 68: 24.46, 32: 23.61, 90: 19.16, 88: 12.91, 98: 7.59, 2: 7.6, 104: 25.44, 4: 13.26, 6: 19.07, 102: 18.95, 8: 23.22, 10: 44.66, 100: 12.92, 12: 2.57, 14: 7.5, 30: 19.02, 16: 13.08, 18: 19.28, 70: 46.92, 96: 2.53, 20: 23.86, 28: 13.04, 92: 25.22, 22: 44.37, 94: 43.21, 24: 2.65, 26: 7.49, 105: 24.12, 73: 3.6, 89: 13.37, 75: 7.92, 103: 18.92, 93: 24.51, 87: 8.05, 83: 43.85, 101: 13.26, 79: 19.0, 99: 8.17, 85: 3.52, 95: 41.09, 81: 24.3, 97: 3.58, 77: 13.23, 91: 19.11, 53: 13.21, 69: 24.43, 27: 7.93, 25: 3.66, 23: 43.6, 21: 24.4, 19: 19.29, 17: 13.26, 29: 13.28, 15: 8.03, 11: 41.98, 9: 24.28, 7: 19.16, 5: 13.33, 3: 8.05, 1: 3.67, 13: 3.6, 31: 19.01, 33: 24.04, 35: 47.48, 67: 19.17, 65: 13.31, 63: 8.04, 61: 3.61, 59: 47.63, 57: 24.3, 55: 19.07, 51: 8.07, 49: 3.45, 47: 44.98, 45: 24.05, 43: 19.03, 41: 13.35, 39: 8.06, 37: 3.59, 71: 54.27, 107: 43.27}}
Upvotes: 1
Views: 343
Reputation: 48879
There is an example of this in the docs:
import altair as alt
from vega_datasets import data
source=data.barley()
bars = alt.Chart(source).mark_bar().encode(
x=alt.X('sum(yield):Q', stack='zero'),
y=alt.Y('variety:N'),
color=alt.Color('site')
)
text = alt.Chart(source).mark_text(dx=-15, dy=3, color='white').encode(
x=alt.X('sum(yield):Q', stack='zero'),
y=alt.Y('variety:N'),
detail='site:N',
text=alt.Text('sum(yield):Q', format='.1f')
)
bars + text
With faceting it can look like this:
import altair as alt
from vega_datasets import data
import random
source=data.barley()
source['group'] = [random.choice(['A', 'B']) for num in range(source.shape[0])]
bars = alt.Chart(source).mark_bar().encode(
x=alt.X('sum(yield):Q', stack='zero'),
y=alt.Y('variety:N'),
color=alt.Color('site')
)
text = alt.Chart(source).mark_text(dx=-15, dy=3, color='white').encode(
x=alt.X('sum(yield):Q', stack='zero'),
y=alt.Y('variety:N'),
detail='site:N',
text=alt.Text('sum(yield):Q', format='.1f')
)
(bars + text).facet(row='group')
Upvotes: 1