2017-03-09 7 views
6

Plots के साथ बैकएंड विशिष्ट कार्यक्षमता तक पहुंच सरल और शक्तिशाली है, लेकिन कभी-कभी मैं अपनी उपस्थिति को सुदृढ़ करने के लिए साजिश के अलग-अलग तत्वों पर थोड़ा अधिक नियंत्रण रखना चाहता हूं।जूलिया प्लॉट्स

क्या बैकएंड की साजिश वस्तु को सीधे अपडेट करना संभव है?

जैसे डिफ़ॉल्ट pyplot बैकएंड के लिए, मैं

using Plots 
p = plot(sin) 
p.o[:axes][1][:xaxis][:set_ticks_position]("top") 

कोशिश की, लेकिन भूखंड नहीं बदलता है। p.o[:show]() कॉल करने के बाद, या तो मदद नहीं करता है।

दूसरे शब्दों में: के साथ शुरू में बनाई गई साजिश के लिए PyPlot इंटरफ़ेस का उपयोग करने का कोई तरीका है?

संपादित करें:

PyPlot वस्तु दिखाई देने लगते हैं (यह भी जीयूआई में) में परिवर्तन जब आंकड़ा की बचत:

using Plots 
using PyPlot 
p = Plots.plot(sin, top_margin=1cm) 
gui() # not needed when using the REPL 
gca()[:xaxis][:set_ticks_position]("top") 
PyPlot.savefig("test.png") 

यहाँ, मैं p.o[:axes][1] == gca() इस्तेमाल किया। किसी को top_margin=1cm सेट करना होगा क्योंकि साजिश क्षेत्र स्वचालित रूप से समायोजित नहीं होता है (मेरे वास्तविक ठीक-ट्यूनिंग के लिए, इससे कोई फर्क नहीं पड़ता)।

यह बाद के अपडेट के लिए भी काम करता है जब तक केवल PyPlot इंटरफ़ेस का उपयोग किया जाता है। उदाहरण के लिए, निम्न कमांड के बाद, साजिश लेबल के अलावा एक लाल दाईं बॉर्डर शीर्ष पर होगा:

gca()[:spines]["right"][:set_color]("red") 
PyPlot.savefig("test.png") 

हालांकि, जब एक Plots आदेश plot!(xlabel="foo") की तरह प्रयोग किया जाता है, PyPlot के साथ किए गए सभी पिछले परिवर्तन ओवरराइट किया है (जो आश्चर्यजनक नहीं है)।

शेष प्रश्न यह है कि PyPlot.savefig को स्पष्ट रूप से कॉल किए बिना गुई को इंटरैक्टिव रूप से अपडेट करने का तरीका है।

उत्तर

1

नहीं - साजिश एक प्लॉट ऑब्जेक्ट है, एक पाइपप्लॉट ऑब्जेक्ट नहीं। आपके विशिष्ट उदाहरण में आप plot(sin, xmirror = true कर सकते हैं)।

+0

लेकिन आप प्लॉट नोटेशन का उपयोग करके सीधे प्लॉट ऑब्जेक्ट को संपादित कर सकते हैं। इस मामले में 'पी [1] [: xaxis] [: दर्पण] = सच; प्रदर्शन (पी) '। प्लॉट दिखाने के किसी भी अपडेट के लिए 'प्रदर्शन() 'आवश्यक है। –

+0

मैं समझता हूं कि 'p' एक 'प्लॉट्स' ऑब्जेक्ट है, लेकिन ऐसा लगता है कि 'p.o' में कम से कम आंशिक रूप से कार्यात्मक' PyPlot 'ऑब्जेक्ट को लपेटना प्रतीत होता है, वर्कअराउंड के लिए मेरा अपडेट किया गया प्रश्न देखें। बेशक, यदि संभव हो तो किसी को 'प्लॉट्स इंटरफ़ेस' का उपयोग करना चाहिए, जैसे कि इस उदाहरण में, लेकिन कभी-कभी मुझे पता है कि 'PyPlot' में एक विशिष्ट परिवर्तन कैसे करें। इसलिए, 'प्लॉट्स' में 90% साजिश के बाद 'पाइपप्लॉट' ('पाइपलॉट बैकएंड का उपयोग करते समय) को पूरी तरह से नियंत्रित करने के लिए मैं एक तरीका की सराहना करता हूं। – tim

+0

बहुत प्रभावशाली हैकिंग :-) –

1

मैं ऐसा करने की कोशिश कर रहा हूं लेकिन मौजूदा प्लॉट को अपडेट करने का कोई समाधान नहीं मिला। लेकिन यहाँ एक आंशिक जवाब है: आप आपत्ति

julia> Plots.plot(sin, 1:4) 

julia> Plots.PyPlot.plt[:xlim]() 
(1.0,4.0) 

julia> Plots.plot(sin, 20:24) 

julia> ax = Plots.PyPlot.plt[:xlim]() 
(20.0,24.0) 

PyPlot कुल्हाड़ियों से जानकारी क्वेरी कर सकता है और यह अद्यतन हो जाता है।

+0

दिलचस्प। बीटीडब्ल्यू आपको पाइप्लॉट के सामने प्लॉट की आवश्यकता नहीं है। –

+0

लेकिन अगर मैं साजिश को संपादित करने के लिए कुछ भी करने के लिए इस्तेमाल किया जा सकता है तो मुझे आश्चर्य होगा। –

+0

और मैंने साजिश को संपादित करने का प्रबंधन नहीं किया। मैंने 'भूखंडों के माध्यम से देखा।थोड़ी देर के लिए जेएल' स्रोत कोड और यह पता नहीं लगा सका कि क्यों प्लॉट्स प्लॉट को सही तरीके से अद्यतन करता है लेकिन मैं इसे क्यों छीन नहीं सकता। मुझे लगता है कि मेरे जुलिआ कौशल काफी अच्छे नहीं हैं, मुझे वास्तव में क्या कहा जाता है यह देखने के लिए डीबगर का उपयोग करना चाहिए था। –