Python 牛郎星子弹图
我试图在Altair中复制,但遇到了一些问题。以下是我目前掌握的情况:Python 牛郎星子弹图,python,vega-lite,altair,Python,Vega Lite,Altair,我试图在Altair中复制,但遇到了一些问题。以下是我目前掌握的情况: # data import and prep import json import altair as alt import pandas as pd df = pd.read_json("""[{"title":"Revenue","subtitle":"US$, in thousands","ranges":[150,225,300],"measures":[220,270],"markers":250}, {"tit
# data import and prep
import json
import altair as alt
import pandas as pd
df = pd.read_json("""[{"title":"Revenue","subtitle":"US$, in thousands","ranges":[150,225,300],"measures":[220,270],"markers":250},
{"title":"Profit","subtitle":"%","ranges":[20,25,30],"measures":[21,23],"markers":26},
{"title":"Order Size","subtitle":"US$, average","ranges":[350,500,600],"measures":[100,320],"markers":550},
{"title":"New Customers","subtitle":"count","ranges":[1400,2000,2500],"measures":[1000,1650],"markers":2100},
{"title":"Satisfaction","subtitle":"out of 5","ranges":[3.5,4.25,5],"measures":[3.2,4.7],"markers":4.4}]""")
df[['measure1','measure2']] = pd.DataFrame(df.measures.values.tolist(), index=df.index)
df[['low', 'medium', 'high']] = pd.DataFrame(df.ranges.values.tolist())
# chart
base = alt.Chart(df).encode(row = 'title:O')
m1 = base.mark_bar().encode(x='measure1:Q')
m2 = base.mark_tick().encode(x='measure2:Q')
到目前为止还不错。但是,当我尝试将两个图表分层时:
m1 + m2
SchemaValidationError: Invalid specification
altair.vegalite.v2.api.LayerChart->layer->items, validating 'anyOf'
{'data': {'name': 'data-58353a9bcf31ee710e2a5cb2da21a143'}, 'mark': 'bar', 'encoding': {'row': {'type': 'nominal', 'field': 'title'}, 'x': {'type': 'quantitative', 'field': 'measure1'}}} is not valid under any of the given schemas
请注意,如果我在两个层和末尾都指定了y
编码,那么这是可行的,但是这违背了创建面的目的(所有的y轴标记在所有面中都是重复的。如果我既没有在基本图表中指定行
编码,也没有指定y
编码,那么只会绘制一个条形图(最大的一个)
我想要facet的原因是,在给定不同数据域的情况下,我可以指定独立的x比例(参见原始示例)
感谢您的帮助!在Altair和vega lite中,将两个面图表分层是无效的(一般来说,无法保证两个面图表在分层时会对齐)。如果您仔细查看vega lite图表,您会发现它不是分层面图表,而是分层图表 Altair也可以这样做:
import altair as alt
import pandas as pd
df = pd.DataFrame.from_records([
{"title":"Revenue","subtitle":"US$, in thousands","ranges":[150,225,300],"measures":[220,270],"markers":[250]},
{"title":"Profit","subtitle":"%","ranges":[20,25,30],"measures":[21,23],"markers":[26]},
{"title":"Order Size","subtitle":"US$, average","ranges":[350,500,600],"measures":[100,320],"markers":[550]},
{"title":"New Customers","subtitle":"count","ranges":[1400,2000,2500],"measures":[1000,1650],"markers":[2100]},
{"title":"Satisfaction","subtitle":"out of 5","ranges":[3.5,4.25,5],"measures":[3.2,4.7],"markers":[4.4]}
])
alt.layer(
alt.Chart().mark_bar(color='#eee').encode(alt.X("ranges[2]:Q", scale=alt.Scale(nice=False), title=None)),
alt.Chart().mark_bar(color='#ddd').encode(x="ranges[1]:Q"),
alt.Chart().mark_bar(color='#ccc').encode(x="ranges[0]:Q"),
alt.Chart().mark_bar(color='lightsteelblue', size=10).encode(x='measures[1]:Q'),
alt.Chart().mark_bar(color='steelblue', size=10).encode(x='measures[0]:Q'),
alt.Chart().mark_tick(color='black').encode(x='markers[0]:Q'),
data=df
).facet(
row="title:O"
).resolve_scale(
x='independent'
)
原始图表中的一些样式/配置选项缺失,但这是一个粗略的想法。在Altair和vega lite中,将两个面图表分层是无效的(通常,无法保证两个面图表在分层时会对齐).如果你仔细观察vega lite图表,你会发现它不是分层刻面图表,而是分层图表 Altair也可以这样做:
import altair as alt
import pandas as pd
df = pd.DataFrame.from_records([
{"title":"Revenue","subtitle":"US$, in thousands","ranges":[150,225,300],"measures":[220,270],"markers":[250]},
{"title":"Profit","subtitle":"%","ranges":[20,25,30],"measures":[21,23],"markers":[26]},
{"title":"Order Size","subtitle":"US$, average","ranges":[350,500,600],"measures":[100,320],"markers":[550]},
{"title":"New Customers","subtitle":"count","ranges":[1400,2000,2500],"measures":[1000,1650],"markers":[2100]},
{"title":"Satisfaction","subtitle":"out of 5","ranges":[3.5,4.25,5],"measures":[3.2,4.7],"markers":[4.4]}
])
alt.layer(
alt.Chart().mark_bar(color='#eee').encode(alt.X("ranges[2]:Q", scale=alt.Scale(nice=False), title=None)),
alt.Chart().mark_bar(color='#ddd').encode(x="ranges[1]:Q"),
alt.Chart().mark_bar(color='#ccc').encode(x="ranges[0]:Q"),
alt.Chart().mark_bar(color='lightsteelblue', size=10).encode(x='measures[1]:Q'),
alt.Chart().mark_bar(color='steelblue', size=10).encode(x='measures[0]:Q'),
alt.Chart().mark_tick(color='black').encode(x='markers[0]:Q'),
data=df
).facet(
row="title:O"
).resolve_scale(
x='independent'
)
原始图表中的一些样式/配置选项缺失,但这只是一个粗略的想法