2025, Nov 01 14:02
Jupyter में Plotly Express व ipywidgets के साथ कई चार्ट दिखाने का सही तरीका
जानिए क्यों Jupyter में Plotly और ipywidgets के Output में केवल आखिरी चार्ट दिखता है, और कैसे show/display के बिना एक संयुक्त display से सभी प्लॉट रेंडर करें.
Jupyter में Plotly Express को ipywidgets के Output कंटेनरों के साथ मिलाने पर अक्सर यह होता है कि केवल आखिरी चार्ट दिखाई देता है, जबकि पहले वाले गायब हो जाते हैं। ग्रिड लेआउट और विजेट का आकार सही लगता है, फिर भी तीन फिगर रेंडर नहीं होते। समस्या ग्रिड में नहीं, बल्कि फिगर्स को दिखाने के तरीके में है।
समस्या को दोहराकर देखना
नीचे दिया उदाहरण चार Plotly चार्ट बनाता है, उन्हें Output क्षेत्रों में रखता है और GridspecLayout में व्यवस्थित करता है। इसके बावजूद, दृश्य में सिर्फ अंतिम चार्ट ही नजर आता है।
import plotly.express as px
import ipywidgets as widgets
from ipywidgets import GridspecLayout, Layout, Output
panel_dims = Layout(
width='100%',
height='300px',
border='1px solid gray',
overflow='auto'
)
cell_bar = Output(layout=panel_dims)
cell_line = Output(layout=panel_dims)
cell_dot = Output(layout=panel_dims)
cell_bins = Output(layout=panel_dims)
iris_tbl = px.data.iris()
with cell_dot:
chart = px.scatter(iris_tbl, x='sepal_width', y='sepal_length', color='species')
chart.show()
tips_tbl = px.data.tips()
with cell_bar:
chart = px.bar(tips_tbl, x='day', y='total_bill', color='sex', barmode='group')
chart.show()
canada_tbl = px.data.gapminder().query("country == 'Canada'")
with cell_line:
chart = px.line(canada_tbl, x='year', y='gdpPercap', title='GDP per Capita - Canada')
chart.show()
with cell_bins:
chart = px.histogram(tips_tbl, x='total_bill', nbins=30, color='sex')
chart.show()
mesh = GridspecLayout(
4, 1,
layout=Layout(
width='100%',
height='auto',
grid_gap='10px'
)
)
mesh[0, 0] = cell_line
mesh[1, 0] = cell_bar
mesh[2, 0] = cell_dot
mesh[3, 0] = cell_bins
mesh
पहले तीन प्लॉट क्यों गायब हो जाते हैं
हर फिगर को दिखाने का तरीका ही वजह है। जब हर चार्ट पर क्रम से show बुलाते हैं, तो आउटपुट में सिर्फ आखिरी वाला रह जाता है। एक फिगर पर display उसी तरह इस्तेमाल करने से भी यही परिणाम मिलता है। अंतिम फिगर से show हटाते ही उससे पिछला दिखने लगता है; उससे हटाएँ तो उससे पहले वाला सामने आ जाता है, और इसी तरह आगे। संक्षेप में, सबसे हाल की कॉल पहले की रेंडरिंग को ओवरराइड कर देती है।
ऐसा समाधान जो हर बार काम करे
हर Plotly फिगर को Output कॉन्टेक्स्ट के अंदर show या display बुलाए बिना बनाइए, फिर सभी फिगर्स को एक साथ एक ही कॉल में display कीजिए। इससे चारों चार्ट एक साथ रेंडर हो जाते हैं। यह तरीका ग्रिड के बिना भी काम करता है।
import plotly.express as px
import ipywidgets as widgets
from ipywidgets import GridspecLayout, Layout, Output
panel_box = Layout(
width='100%',
height='300px',
border='1px solid gray',
overflow='auto'
)
box_bar = Output(layout=panel_box)
box_line = Output(layout=panel_box)
box_scatter = Output(layout=panel_box)
box_hist = Output(layout=panel_box)
iris_data = px.data.iris()
with box_scatter:
fig_a = px.scatter(iris_data, x='sepal_width', y='sepal_length', color='species')
bill_data = px.data.tips()
with box_bar:
fig_b = px.bar(bill_data, x='day', y='total_bill', color='sex', barmode='group')
ca_data = px.data.gapminder().query("country == 'Canada'")
with box_line:
fig_c = px.line(ca_data, x='year', y='gdpPercap', title='GDP per Capita - Canada')
with box_hist:
fig_d = px.histogram(bill_data, x='total_bill', nbins=30, color='sex')
layout_grid = GridspecLayout(
4, 1,
layout=Layout(
width='100%',
height='auto',
grid_gap='10px'
)
)
layout_grid[0, 0] = box_line
layout_grid[1, 0] = box_bar
layout_grid[2, 0] = box_scatter
layout_grid[3, 0] = box_hist
# लेआउट ग्रिड
display(fig_a, fig_b, fig_c, fig_d)
आपकी नोटबुक्स के लिए यह क्यों मायने रखता है
Jupyter में Plotly और ipywidgets के साथ डैशबोर्ड या विश्लेषण रिपोर्ट बनाते समय अक्सर मान लिया जाता है कि अलग-अलग आउटपुट में क्रम से रेंडर करने पर कई चार्ट साथ दिखेंगे। व्यवहार में, आखिरी रेंडरिंग कॉल सब पर हावी हो सकती है। यह जानना कि show या किसी एक फिगर पर किया गया display पहले के प्लॉट्स को छिपा सकता है, आपको उन लेआउट या साइजिंग समस्याओं के पीछे भागने से बचाता है जिनकी यहाँ कोई गलती नहीं होती।
निष्कर्ष
यदि कई Plotly फिगर नहीं दिख रहे और केवल नवीनतम चार्ट रह जाता है, तो show या किसी एक फिगर के display को बार-बार कॉल करने से बचें। फिगर्स बनाइए, उन्हें वेरिएबल्स में रखिए, और एक संयुक्त display कॉल से सभी को साथ में रेंडर कीजिए। इसी छोटे बदलाव से चारों चार्ट भरोसेमंद तरीके से दिखते हैं—विजेट ग्रिड हो या न हो।
यह लेख StackOverflow के प्रश्न (लेखक: Mohamad Osama) और furas के उत्तर पर आधारित है।