如何使用Altair创建嵌套分组条形图?增加样品d

2024-05-16 07:35:52 发布

您现在位置:Python中文网/ 问答频道 /正文

<table class="table table-bordered table-hover table-condensed"> <thead><tr><th title="Field #1">year</th> <th title="Field #2">primary_type</th> <th title="Field #3">Number_of_Incidents</th> <th title="Field #4">number_of_arrests</th> <th title="Field #5">percent_arrest</th> <th title="Field #6">rank</th> </tr></thead> <tbody><tr> <td align="right">2018</td> <td>THEFT</td> <td align="right">57330</td> <td align="right">5503</td> <td align="right">9.6</td> <td align="right">1</td> </tr> <tr> <td align="right">2018</td> <td>BATTERY</td> <td align="right">44667</td> <td align="right">8886</td> <td align="right">19.89</td> <td align="right">2</td> </tr> <tr> <td align="right">2018</td> <td>CRIMINAL DAMAGE</td> <td align="right">24889</td> <td align="right">1498</td> <td align="right">6.02</td> <td align="right">3</td> </tr> <tr> <td align="right">2018</td> <td>ASSAULT</td> <td align="right">18229</td> <td align="right">2931</td> <td align="right">16.08</td> <td align="right">4</td> </tr> <tr> <td align="right">2018</td> <td>DECEPTIVE PRACTICE</td> <td align="right">15879</td> <td align="right">713</td> <td align="right">4.49</td> <td align="right">5</td> </tr> <tr> <td align="right">2017</td> <td>THEFT</td> <td align="right">64334</td> <td align="right">6459</td> <td align="right">10.04</td> <td align="right">1</td> </tr> <tr> <td align="right">2017</td> <td>BATTERY</td> <td align="right">49213</td> <td align="right">10060</td> <td align="right">20.44</td> <td align="right">2</td> </tr> <tr> <td align="right">2017</td> <td>CRIMINAL DAMAGE</td> <td align="right">29040</td> <td align="right">1747</td> <td align="right">6.02</td> <td align="right">3</td> </tr> <tr> <td align="right">2017</td> <td>ASSAULT</td> <td align="right">19298</td> <td align="right">3455</td> <td align="right">17.9</td> <td align="right">4</td> </tr> <tr> <td align="right">2017</td> <td>DECEPTIVE PRACTICE</td> <td align="right">18816</td> <td align="right">805</td> <td align="right">4.28</td> <td align="right">5</td> </tr> <tr> <td align="right">2016</td> <td>THEFT</td> <td align="right">61600</td> <td align="right">6518</td> <td align="right">10.58</td> <td align="right">1</td> </tr> <tr> <td align="right">2016</td> <td>BATTERY</td> <td align="right">50292</td> <td align="right">10328</td> <td align="right">20.54</td> <td align="right">2</td> </tr> <tr> <td align="right">2016</td> <td>CRIMINAL DAMAGE</td> <td align="right">31018</td> <td align="right">1668</td> <td align="right">5.38</td> <td align="right">3</td> </tr> <tr> <td align="right">2016</td> <td>ASSAULT</td> <td align="right">18738</td> <td align="right">3490</td> <td align="right">18.63</td> <td align="right">4</td> </tr> <tr> <td align="right">2016</td> <td>DECEPTIVE PRACTICE</td> <td align="right">18733</td> <td align="right">815</td> <td align="right">4.35</td> <td align="right">5</td> </tr> <tr> <td align="right">2015</td> <td>THEFT</td> <td align="right">57335</td> <td align="right">6771</td> <td align="right">11.81</td> <td align="right">1</td> </tr> <tr> <td align="right">2015</td> <td>BATTERY</td> <td align="right">48918</td> <td align="right">11558</td> <td align="right">23.63</td> <td align="right">2</td> </tr> <tr> <td align="right">2015</td> <td>CRIMINAL DAMAGE</td> <td align="right">28675</td> <td align="right">1835</td> <td align="right">6.4</td> <td align="right">3</td> </tr> <tr> <td align="right">2015</td> <td>NARCOTICS</td> <td align="right">23883</td> <td align="right">23875</td> <td align="right">99.97</td> <td align="right">4</td> </tr> <tr> <td align="right">2015</td> <td>OTHER OFFENSE</td> <td align="right">17552</td> <td align="right">4795</td> <td align="right">27.32</td> <td align="right">5</td> </tr> <tr> <td align="right">2014</td> <td>THEFT</td> <td align="right">61561</td> <td align="right">7415</td> <td align="right">12.04</td> <td align="right">1</td> </tr> <tr> <td align="right">2014</td> <td>BATTERY</td> <td align="right">49447</td> <td align="right">12517</td> <td align="right">25.31</td> <td align="right">2</td> </tr> <tr> <td align="right">2014</td> <td>NARCOTICS</td> <td align="right">29116</td> <td align="right">29000</td> <td align="right">99.6</td> <td align="right">3</td> </tr> <tr> <td align="right">2014</td> <td>CRIMINAL DAMAGE</td> <td align="right">27798</td> <td align="right">2095</td> <td align="right">7.54</td> <td align="right">4</td> </tr> <tr> <td align="right">2014</td> <td>OTHER OFFENSE</td> <td align="right">16979</td> <td align="right">4159</td> <td align="right">24.49</td> <td align="right">5</td> </tr> <tr> <td align="right">2013</td> <td>THEFT</td> <td align="right">71530</td> <td align="right">7727</td> <td align="right">10.8</td> <td align="right">1</td> </tr> <tr> <td align="right">2013</td> <td>BATTERY</td> <td align="right">54002</td> <td align="right">12927</td> <td align="right">23.94</td> <td align="right">2</td> </tr> <tr> <td align="right">2013</td> <td>NARCOTICS</td> <td align="right">34127</td> <td align="right">33819</td> <td align="right">99.1</td> <td align="right">3</td> </tr> <tr> <td align="right">2013</td> <td>CRIMINAL DAMAGE</td> <td align="right">30853</td> <td align="right">2107</td> <td align="right">6.83</td> <td align="right">4</td> </tr> <tr> <td align="right">2013</td> <td>OTHER OFFENSE</td> <td align="right">17993</td> <td align="right">3400</td> <td align="right">18.9</td> <td align="right">5</td> </tr> </tbody></table>

我有一个独特的情况。在我的数据中,我有年份,在每一年内,我有5个类别和它对应的计数。我能够为相应年份创建这5个类别的堆积条形图。但是,我想在我的x轴上显示每年5个相邻的条。对于y轴,它应该显示每个条对应的总计。在

以下是我当前的viz和代码:

^{pr2}$

enter image description here

我的问题是,如何在我的x轴上为每年创建5个相邻的条形图,而不是堆积条形图?在

提前谢谢你的帮助。在


Tags: rightfieldtitletabletrtddamageassault
2条回答

@jakevdp已经回答了,但是为了回答您的最后一个问题(即使您有多个观点,您应该问几个问题),您可以用alt.EncodingSortField对这些条进行排序。在

import altair as alt

alt.Chart(q13a).mark_bar().encode(
    x=alt.X('primary_type:N', 
            scale=alt.Scale(rangeStep=8), 
            axis=None,
            sort=alt.EncodingSortField(field='Number_of_Incident', 
                                       op='sum', 
                                       order='ascending')
           ),
    y=alt.Y('sum(Number_of_Incidents):Q', title='sum(Number_of_Incidents)'),
    color='primary_type:N',
    tooltip=['primary_type:N', 
             'year:O', 
             alt.Tooltip('sum(Number_of_Incidents):Q',
                         title='Number of incidents')
            ]
).facet(
    column=alt.Column('year:O', 
                      header=alt.Header(title=None)),
).resolve_scale(
    x='independent'
).configure_view(
    stroke='transparent'
)

altair-sorted-grouped-bar-chart


数据

^{pr2}$

创建于2018年11月28日reprexpy package

制作并排条的唯一方法是在x编码的同时使用列编码。您可以遵循Altair示例库中的分组条形图示例:https://altair-viz.github.io/gallery/grouped_bar_chart.html

数据的结果如下:

import altair as alt
import pandas as pd
import numpy as np

q13a = pd.DataFrame({
    'year': np.random.randint(2000, 2018, 100),
    'Number_of_Incidents': np.random.randint(0, 20, 100),
    'percent_arrest': np.random.rand(100),
    'primary_type': np.random.choice(['a', 'b', 'c', 'd', 'e'], 100)
})

alt.Chart(q13a).mark_bar().encode(
    x=alt.X('primary_type', scale=alt.Scale(rangeStep=8), title=None),
    y=alt.Y('sum(Number_of_Incidents)', title='sum(Number_of_Incidents)'),
    color='primary_type',
    column='year',
    tooltip=['year']
).configure_view(
    stroke='transparent'
)

enter image description here

相关问题 更多 >