मैं एक समय-श्रृंखला क्षेत्र प्लॉट प्लॉट करना चाहता हूं, जहां सकारात्मक (>= 0) मान एक रंग में भरे जाते हैं और नकारात्मक (<0) मान दूसरे में भरे जाते हैं।

यह उदाहरण लेते हुए:

import pandas as pd
import numpy as np
import plotly.express as px

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv').assign(
    PnL = lambda x: x['AAPL.Close'] - 100
)
px.area(
    data_frame = df,
    x = 'Date',
    y = 'PnL',
    width = 500,
    height = 300
)

figure_1

मैं उन हिस्सों को चाहता हूं जहां पीएनएल 0 से नीचे लाल हो जाए।

तो मैंने यही कोशिश की:

import pandas as pd
import numpy as np
import plotly.express as px

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv').assign(
    PnL = lambda x: x['AAPL.Close'] - 100
)
df['sign'] = np.where(df['PnL'] >= 0, 'positive', 'negative')
px.area(
    data_frame = df,
    x = 'Date',
    y = 'PnL',
    color = 'sign',
    color_discrete_map = {
        'positive': 'steelblue',
        'negative': 'crimson'
    },
    width = 500,
    height = 300
)

लेकिन यह मुझे देता है:

figure_2

जो मैं ढूंढ रहा हूं वह बिल्कुल नहीं है। ऐसा करने का सबसे अच्छा तरीका क्या है?

2
kraussian 3 सितंबर 2021, 06:28
क्या आप कृपया विस्तार से बता सकते हैं कि आप जो खोज रहे हैं उससे अलग क्या है?
 – 
r-beginners
3 सितंबर 2021, 06:39

1 उत्तर

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

यह सबसे अच्छा है जो मैं उस समय में कर सकता था जब मेरे पास इसके लिए धैर्य था:

import plotly.graph_objects as go

mask = df['PnL'] >= 0
df['PnL_above'] = np.where(mask, df['PnL'], 0)
df['PnL_below'] = np.where(mask, 0, df['PnL'])

fig = go.Figure()
fig.add_trace(go.Scatter(x=df['Date'], y=df['PnL_above'], fill='tozeroy'))
fig.add_trace(go.Scatter(x=df['Date'], y=df['PnL_below'], fill='tozeroy'))

नतीजा:

स्पष्ट रूप से आदर्श नहीं है, लेकिन आपको वहां सबसे अधिक मिलता है। कुछ मामूली कलाकृतियाँ हैं जहाँ दो निशान मिलते हैं, और स्पष्ट रूप से रेखा का रंग तब भी दिखाई देता है जब मान शून्य होता है।

दो निशानों में mode='none' जोड़कर, आप लाइन को हटा सकते हैं और केवल भरे हुए क्षेत्र को रेंडर कर सकते हैं:

1
ddejohn 3 सितंबर 2021, 07:34