मैं अल्टेयर (और प्रत्येक के लिए एक लंबवत माध्य शासक) में दो स्तरित हिस्टोग्राम बनाने का प्रयास कर रहा हूं। मैं इन चारों में से प्रत्येक को लेबल करने के लिए एक किंवदंती चाहूंगा।

मैं पहले 'बर्थ वेट I' डेटा का उपयोग कर रहा हूं जो यहां पाया जा सकता है

मेरा कोड (वास्तविक लंबा, क्षमा याचना) कुछ इस तरह दिखता है:

from altair import datum

# This histogram for baby weights of mothers who dont smoke
dont = alt.Chart(babyData).mark_bar().encode(
    alt.X("bwt-oz:Q", axis=alt.Axis(title='Birth Weight (Ounces)'), bin=True),
    alt.Y('count()', axis=alt.Axis(title='Count'), scale=alt.Scale(domain=[0, 350]))
).properties(
    width=400,
    height=400
).transform_filter(
    datum.smoke == 0,
)

mean = alt.Chart(babyData).mark_rule(color='red').encode(
    x='mean(bwt-oz):Q',
    size=alt.value(4)
).transform_filter(
    datum.smoke == 0
)

dontSmokeChart = dont + mean

# This histogram for baby weights of mothers who smoke
do = alt.Chart(babyData).mark_bar().encode(
    alt.X("bwt-oz:Q", axis=alt.Axis(title='Birth Weight (Ounces)'), bin=True),
    alt.Y('count()', axis=alt.Axis(title='Count'), scale=alt.Scale(domain=[0, 350]))
).transform_filter(
    datum.smoke == 1
).properties(
    width=400,
    height=400
)

mean2 = alt.Chart(babyData).mark_rule(color='red').encode(
    x='mean(bwt-oz):Q',
    size=alt.value(4)
).transform_filter(
    datum.smoke == 1
)

doSmokeChart = do + mean2

# This layers, and puts them all together

layer = alt.layer(
    dont,
    mean,
    do,
    mean2
).properties(
    title="Layered Histogram of Baby Weights of Mothers Who smoke Vs. Who Don't",
).configure_mark(
    opacity=0.5,
    color='blue',
)
layer

अंतिम स्तरित चार्ट कुछ इस तरह दिखता है: https://i.stack.imgur.com/OR9f4.png

मैं केवल यह बताना चाहूंगा कि कौन सा हिस्टोग्राम/माध्य किससे संबंधित है।

अगर मैं उन्हें भी रंग सकता हूं, और शायद इस तरह से एक किंवदंती जोड़ सकता हूं, तो यह भी अच्छा होगा, लेकिन मुझे यकीन नहीं है कि यह कैसे करना है।

किसी भी अंतर्दृष्टि के लिए धन्यवाद!

1
Marco Sousa 26 जिंदा 2020, 22:34

2 जवाब

सबसे बढ़िया उत्तर

फ़िल्टर किए गए डेटा के साथ मैन्युअल रूप से परतें बनाने के बजाय, आपको अपने पूर्ण डेटासेट पर एक रंग एन्कोडिंग का उपयोग करना चाहिए: फिर एक लेजेंड स्वचालित रूप से उत्पन्न हो जाएगा।

उदाहरण के लिए:

import altair as alt
import pandas as pd

babyData = pd.read_csv('https://www.stat.berkeley.edu/users/statlabs/data/babiesI.data', delim_whitespace=True)

base = alt.Chart(babyData).transform_filter(
    'datum.smoke != 9'
)

hist = base.mark_bar(opacity=0.5).encode(
    alt.X("bwt:Q",title='Birth Weight (Ounces)', bin=True),
    alt.Y('count()', title='Count'),
    color='smoke:N'
).properties(
    width=400,
    height=400
)

mean = base.mark_rule().encode(
    x='mean(bwt):Q',
    size=alt.value(4),
    color='smoke:N'
)

hist + mean

enter image description here

वहां से आप प्रत्येक चिह्न के लिए उपयोग की जाने वाली रंग योजनाओं को अनुकूलित करें के मानक तरीकों का उपयोग कर सकते हैं .

3
jakevdp 29 जिंदा 2020, 03:54

@jakevdp ने मुझे इसे हरा दिया! मैं भी यही बात कहने के लिए जा रहा था। आपके साथ काम करने के लिए यहां एक पूरा उदाहरण दिया गया है।

import pandas as pd
import altair as alt

# Link to data source
URL =  'https://www.stat.berkeley.edu/users/statlabs/data/babiesI.data'
# Read data into a pandas dataframe
df = pd.read_table(URL, sep='\s+')

hist = alt.Chart(df).mark_area(
    opacity=0.7,
    interpolate='step'
).encode(
    alt.X("bwt:Q", axis=alt.Axis(title='Birth Weight (Ounces)'), bin=True),
    alt.Y('count()', axis=alt.Axis(title='Count'), stack=None), 
    alt.Color('smoke:N')
).properties(
    width=400,
    height=400
).transform_filter(alt.datum.smoke != 9)

rule = alt.Chart(df).mark_rule(color='red').encode(
    alt.Detail('smoke:N'),
    alt.Color('smoke:N'),
    alt.X('mean(bwt):Q'),
    size=alt.value(4), 
).transform_filter(alt.datum.smoke != 9)

hist + rule

2
eitanlees 28 जिंदा 2020, 20:59