簡體   English   中英

帶有可變寬度條形的 Altair 條形圖?

[英]Altair bar chart with bars of variable width?

我正在嘗試在 Python 中使用 Altair 來制作條形圖,其中條形圖的寬度取決於源數據框列中的數據。 最終目標是獲得這樣的圖表:

帶有可變寬度條形的條形圖

條形的高度對應於每種能源技術的邊際成本(作為源數據框中的一列給出)。 條形寬度對應於每種能源技術的容量(也在源數據框中以列的形式給出)。 顏色也是來自源數據幀的有序數據。 條形按邊際成本的升序排列。 (這樣的情節在能源行業被稱為“發電棧”)。 這在 matplotlib 中很容易實現,如下面的代碼所示:

import matplotlib.pyplot as plt 

# Make fake dataset
height = [3, 12, 5, 18, 45]
bars = ('A', 'B', 'C', 'D', 'E')

# Choose the width of each bar and their positions
width = [0.1,0.2,3,1.5,0.3]
y_pos = [0,0.3,2,4.5,5.5]

# Make the plot
plt.bar(y_pos, height, width=width)
plt.xticks(y_pos, bars)
plt.show()

(代碼來自https://python-graph-gallery.com/5-control-width-and-space-in-barplots/

但是有沒有辦法用 Altair 做到這一點? 我想用 Altair 來做到這一點,這樣我仍然可以獲得 Altair 的其他強大功能,如工具提示、選擇器/綁定,因為我有很多其他數據要與條形圖一起顯示。

我的源數據的前 20 行如下所示:

在此處輸入圖片說明

(與上面顯示的圖表不完全匹配)。

在 Altair 中,這樣做的方法是使用rect標記並明確構建您的條形。 這是一個模仿您的數據的示例:

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

np.random.seed(0)

df = pd.DataFrame({
    'MarginalCost': 100 * np.random.rand(30),
    'Capacity': 10 * np.random.rand(30),
    'Technology': np.random.choice(['SOLAR', 'THERMAL', 'WIND', 'GAS'], 30)
})

df = df.sort_values('MarginalCost')
df['x1'] = df['Capacity'].cumsum()
df['x0'] = df['x1'].shift(fill_value=0)

alt.Chart(df).mark_rect().encode(
    x=alt.X('x0:Q', title='Capacity'),
    x2='x1',
    y=alt.Y('MarginalCost:Q', title='Marginal Cost'),
    color='Technology:N',
    tooltip=["Technology", "Capacity", "MarginalCost"]
)

在此處輸入圖片說明

要在不預處理數據的情況下獲得相同的結果,您可以使用 Altair 的轉換語法:

df = pd.DataFrame({
    'MarginalCost': 100 * np.random.rand(30),
    'Capacity': 10 * np.random.rand(30),
    'Technology': np.random.choice(['SOLAR', 'THERMAL', 'WIND', 'GAS'], 30)
})

alt.Chart(df).transform_window(
    x1='sum(Capacity)',
    sort=[alt.SortField('MarginalCost')]
).transform_calculate(
    x0='datum.x1 - datum.Capacity'
).mark_rect().encode(
    x=alt.X('x0:Q', title='Capacity'),
    x2='x1',
    y=alt.Y('MarginalCost:Q', title='Marginal Cost'),
    color='Technology:N',
    tooltip=["Technology", "Capacity", "MarginalCost"]
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM