使用 Altair 绘制多索引数据框
Plotting a multi-index dataframe with Altair
我有一个数据框,看起来像:
data = {'ColA': {('A', 'A-1'): 0,
('A', 'A-2'): 1,
('A', 'A-3'): 1,
('B', 'B-1'): 2,
('B', 'B-2'): 2,
('B', 'B-3'): 0,
('C', 'C-1'): 1,
('C', 'C-2'): 2,
('C', 'C-3'): 2,
('C', 'C-4'): 3},
'ColB': {('A', 'A-1'): 3,
('A', 'A-2'): 1,
('A', 'A-3'): 1,
('B', 'B-1'): 0,
('B', 'B-2'): 2,
('B', 'B-3'): 2,
('C', 'C-1'): 2,
('C', 'C-2'): 0,
('C', 'C-3'): 3,
('C', 'C-4'): 1}}
df = pd.DataFrame( data )
每列的值是 0、1、2 或 3。这些值可以很容易地是 'U'、'Q'、'R' 或 'Z' ...即它们本身没有任何数字。
我想用Altair
** 第一组图表
我想要每列一个条形图。
X 轴的标签应基于列中的唯一值。 Y 轴应该是列中唯一值的计数。
** 第二组图表
与第一组类似,我想要每行一个条形图。
X 轴的标签应基于行中的唯一值。 Y 轴应该是行中唯一值的计数。
这应该很容易,但我不知道该怎么做。
Altair 的所有 API 都是基于列的,并且会忽略索引,除非您明确包含它们(请参阅 Altair 文档中的 Including Index Data)。
对于第一组图表(每列一个条形图),您可以这样做:
alt.Chart(df.reset_index()).mark_bar().encode(
alt.X(alt.repeat(), type='nominal'),
y='count()'
).repeat(['ColA', 'ColB'])
对于第二组图表(每行一个条形图),您可以这样做:
df_transposed = df.reset_index(0, drop=True).T
alt.Chart(df_transposed).mark_bar().encode(
alt.X(alt.repeat(), type='nominal'),
y='count()'
).repeat(list(df_transposed.columns), columns=5)
尽管这有点奇怪,所以我怀疑我误解了你的意思...你的数据有十行,所以每行一个图表是十个图表。
我有一个数据框,看起来像:
data = {'ColA': {('A', 'A-1'): 0,
('A', 'A-2'): 1,
('A', 'A-3'): 1,
('B', 'B-1'): 2,
('B', 'B-2'): 2,
('B', 'B-3'): 0,
('C', 'C-1'): 1,
('C', 'C-2'): 2,
('C', 'C-3'): 2,
('C', 'C-4'): 3},
'ColB': {('A', 'A-1'): 3,
('A', 'A-2'): 1,
('A', 'A-3'): 1,
('B', 'B-1'): 0,
('B', 'B-2'): 2,
('B', 'B-3'): 2,
('C', 'C-1'): 2,
('C', 'C-2'): 0,
('C', 'C-3'): 3,
('C', 'C-4'): 1}}
df = pd.DataFrame( data )
每列的值是 0、1、2 或 3。这些值可以很容易地是 'U'、'Q'、'R' 或 'Z' ...即它们本身没有任何数字。
我想用Altair
** 第一组图表
我想要每列一个条形图。
X 轴的标签应基于列中的唯一值。 Y 轴应该是列中唯一值的计数。
** 第二组图表
与第一组类似,我想要每行一个条形图。
X 轴的标签应基于行中的唯一值。 Y 轴应该是行中唯一值的计数。
这应该很容易,但我不知道该怎么做。
Altair 的所有 API 都是基于列的,并且会忽略索引,除非您明确包含它们(请参阅 Altair 文档中的 Including Index Data)。
对于第一组图表(每列一个条形图),您可以这样做:
alt.Chart(df.reset_index()).mark_bar().encode(
alt.X(alt.repeat(), type='nominal'),
y='count()'
).repeat(['ColA', 'ColB'])
对于第二组图表(每行一个条形图),您可以这样做:
df_transposed = df.reset_index(0, drop=True).T
alt.Chart(df_transposed).mark_bar().encode(
alt.X(alt.repeat(), type='nominal'),
y='count()'
).repeat(list(df_transposed.columns), columns=5)
尽管这有点奇怪,所以我怀疑我误解了你的意思...你的数据有十行,所以每行一个图表是十个图表。