2012-10-03 15 views
5

मैं matplotlib में किंवदंती पर एक आयताकार साजिश करने की कोशिश कर रहा हूँ।मैं matplotlib में पौराणिक कथाओं पर एक आयताकार कैसे आकर्षित करूं?

इसे समझने के लिए कितनी दूर मैं मिल गया है मैं अपना सर्वश्रेष्ठ प्रयास है, जो काम नहीं करता है दिखाने:

import matplotlib.pyplot as plt 
from matplotlib.patches import Rectangle 
import numpy as np 

Fig = plt.figure() 
ax = plt.subplot(111) 

t = np.arange(0.01, 10.0, 0.01) 
s1 = np.exp(t) 
ax.plot(t, s1, 'b-', label = 'dots') 

leg = ax.legend() 

rectangle = Rectangle((leg.get_frame().get_x(), 
        leg.get_frame().get_y()), 
        leg.get_frame().get_width(), 
        leg.get_frame().get_height(), 
        fc = 'red' 
       ) 

ax.add_patch(rectangle) 

plt.show() 

आयत सिर्फ आंकड़ा कहीं आकर्षित नहीं है। यदि मैं leg.get_frame() के मानों को देखता हूं। Get_x(), leg.get_frame()। Get_y()), leg.get_frame()। Get_width() और leg.get_frame()। Get_height(), I देखें कि वे क्रमशः 0.0, 0.0, 1.0 और 1.0 हैं।

किंवदंती के फ्रेम के समन्वय को खोजने के लिए मेरी समस्या इस प्रकार दिखती है।

यदि आप मेरी मदद कर सकते हैं तो यह वास्तव में बहुत अच्छा होगा।

इसे पढ़ने के लिए धन्यवाद।

+1

क्यों आप ऐसा करने की कोशिश कर रहे हैं? क्या आप वाकई 'किंवदंती' वस्तु में कुछ नहीं बनाया है जो आपके लिए यह करेगा? – tacaswell

उत्तर

2

समस्या यह है कि किंवदंती की स्थिति अग्रिम में ज्ञात नहीं है। केवल तभी जब आप आकृति प्रस्तुत करते हैं (plot() पर कॉल करना), स्थिति तय की गई है।

एक समाधान मैं आया across आंकड़ा दो बार आकर्षित करना है। इसके अलावा, मैंने axes coordinates (डिफ़ॉल्ट डेटा निर्देशांक है) का उपयोग किया है और आयत को स्केल किया है ताकि आप अभी भी इसके पीछे की किंवदंती को देख सकें। ध्यान दें कि मुझे किंवदंती और आयत zorder भी सेट करना था; पौराणिक कथा आयत से बाद में खींची जाती है और इस प्रकार आयताकार अन्यथा किंवदंती के पीछे गायब हो जाता है।

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.patches import Rectangle 

Fig = plt.figure() 
ax = plt.subplot(111) 

t = np.arange(0.01, 10.0, 0.01) 
s1 = np.exp(t) 
ax.plot(t, s1, 'b-', label = 'dots') 

leg = ax.legend() 
leg.set_zorder(1) 
plt.draw() # legend position is now known 
bbox = leg.legendPatch.get_bbox().inverse_transformed(ax.transAxes) 
rectangle = Rectangle((bbox.x0, bbox.y0), 
         bbox.width*0.8, bbox.height*0.8, 
         fc='red', transform=ax.transAxes, zorder=2) 
ax.add_patch(rectangle) 
plt.show() 
संबंधित मुद्दे