क्या एक्स-अक्ष की पूरी लंबाई में फैले आयत को प्लॉट करने का कोई तरीका है लेकिन एक निश्चित और स्थिर ऊंचाई के साथ, मान लीजिए २० पिक्सल? आयत की ऊंचाई पिक्सेल की एक स्थिर संख्या बनी रहनी चाहिए, भले ही प्लॉट को ज़ूम करने या आकार बदलने का। मैंने इसके समाधान की तलाश में घंटों बिताए हैं लेकिन मैं इसे काम नहीं कर सकता। कोई सुझाव? धन्यवाद यहां छवि विवरण दर्ज करें

2
Pman70 2 नवम्बर 2018, 18:47

1 उत्तर

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

आप एक आयत बनाना चाहते हैं, जो कुल्हाड़ियों के निर्देशांक में स्थित है, और क्षैतिज रूप से अक्षों के निर्देशांक में भी आकार में है, लेकिन पिक्सेल (स्क्रीन-) निर्देशांक में ऊंचाई के साथ।

यहां मुश्किल बात यह है कि केवल एक मिश्रित परिवर्तन को लागू करने से काम नहीं चलता, क्योंकि y स्थिति को आयत की ऊंचाई की तुलना में एक अलग समन्वय प्रणाली में होना चाहिए; y दिशा में कोई समस्या नहीं है, क्योंकि स्थिति और चौड़ाई दोनों एक ही समन्वय फ्रेम होंगे।
तीन संभावित विकल्प नीचे दिखाए गए हैं।

A. ऑफ़सेट बॉक्स का उपयोग करना

एक समाधान है आयत बनाना और उसे एक matplotlib.offsetbox.AuxTransformBoxमें पैक करना. फिर मिश्रित रूपांतरण को AuxTransformBox पर लागू करने से केवल चौड़ाई और ऊंचाई प्रभावित होगी।
इसके बाद AuxTransformBox को matplotlib.offsetbox.AnchoredOffsetbox< में पैक किया जा सकता है /ए>. यह एक लेजेंड के समान, एक बॉक्स के अंदर स्थित होता है, जो डिफ़ॉल्ट रूप से एक्सिस बॉक्स होता है। चूंकि अक्ष वास्तव में यहां उपयोग की जाने वाली वांछित प्रणाली है, कोई bbox_to_anchor निर्दिष्ट करने की आवश्यकता नहीं है। अक्ष बॉक्स के अंदर, निचले बाएँ कोने को एंकर पॉइंट (loc="lower left") के रूप में चुना जाता है।

import matplotlib.pyplot as plt
import matplotlib.offsetbox
import matplotlib.transforms as mtransforms

fig, ax = plt.subplots()

# create rectangle with 
# * lower left corner at (0,0); will later be interpreted as axes coordinates
# * width=1; will later be interpreted in axes coordinates
# * height=20; will later be interpreted as pixel coordinates
rect = plt.Rectangle((0,0), 1,20)

# create transform; axes coordinates along x axis, pixel coordinates along y axis
trans = mtransforms.blended_transform_factory(ax.transAxes, 
                                              mtransforms.IdentityTransform())
# create an offset box from the above transform; the contents will be transformed
# with trans from above
aux = matplotlib.offsetbox.AuxTransformBox(trans)
aux.add_artist(rect)

# create an anchored offsetbox. Its child is the aux box from above,
# its position is the lower left corner of the axes (loc="lower left")
ab = matplotlib.offsetbox.AnchoredOffsetbox("lower left", pad=0, borderpad=0, frameon=False)
ab.set_child(aux)

ax.add_artist(ab)
plt.show()

enter image description here

अब आयत हमेशा कुल्हाड़ियों से जुड़ी रहती है, यहां तक ​​कि पैनिंग/ज़ूमिंग/रिस्केलिंग पर भी।

B. कॉलबैक का उपयोग करना

वैकल्पिक रूप से, आप आयत की ऊंचाई को समायोजित करने के लिए कॉलबैक का उपयोग कर सकते हैं।

मैं। अक्ष निर्देशांक, अद्यतन ऊंचाई

यहां आयत को अक्ष निर्देशांक में परिभाषित किया जा सकता है, जो स्थिति के साथ-साथ चौड़ाई के लिए भी उपयोगी है। फिर ऊंचाई की गणना पिक्सल में कुल्हाड़ियों की ऊंचाई से विभाजित 20 पिक्सल के रूप में की जा सकती है। फिर आप हर बार आकृति का आकार बदलने और कुल्हाड़ियों की ऊंचाई बदलने पर ऊंचाई की पुनर्गणना कर सकते हैं।

import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms

fig, ax = plt.subplots()

height = 20 # pixels
rect = plt.Rectangle((0,0), 1,1, transform=ax.transAxes)
ax.add_patch(rect)

def update_rect(evt=None):
    bbox_pixel = mtransforms.TransformedBbox(ax.get_position(), fig.transFigure)
    rect.set_height(height/bbox_pixel.height)

update_rect()
fig.canvas.mpl_connect("resize_event", update_rect)

plt.show()

Ii. पिक्सेल निर्देशांक, अद्यतन स्थिति और चौड़ाई

समान रूप से आप निश्चित रूप से पिक्सेल निर्देशांक में आयत को परिभाषित कर सकते हैं, और वास्तविक अक्ष आकार के आधार पर चौड़ाई और स्थिति निर्धारित करने के लिए कॉलबैक का उपयोग कर सकते हैं।

import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms

fig, ax = plt.subplots()

pos = (0,0) #axes coordinates
width = 1   #   -"-
rect = plt.Rectangle((0,0), 20,20, transform=None)
ax.add_patch(rect)

def update_rect(evt=None):
    bbox_pixel = mtransforms.TransformedBbox(ax.get_position(), fig.transFigure)
    print(bbox_pixel.width)
    rect.set_width(bbox_pixel.width*width)
    rect.set_xy((bbox_pixel.x0 + pos[0]*bbox_pixel.width, 
                 bbox_pixel.y0 + pos[1]*bbox_pixel.height))

update_rect()
fig.canvas.mpl_connect("resize_event", update_rect)

plt.show()

C. इनसेट कुल्हाड़ियों का निर्माण

आप निचले बाएँ कोने में स्थित एक इनसेट कुल्हाड़ियों भी बना सकते हैं जो मूल कुल्हाड़ियों का 100% चौड़ा और 20 पिक्सेल / आंकड़ा-डीपीआई लंबा है। उस इनसेट के अंदर आप एक आयत बना सकते हैं जो पूरी कुल्हाड़ियों को भरती है।

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes

fig, ax = plt.subplots()

rect_ax = inset_axes(ax, "100%", 20/fig.dpi, loc="lower left", borderpad=0)
rect_ax.axis("off")

rect=plt.Rectangle((0,0), 1,1, transform=rect_ax.transAxes)
rect_ax.add_patch(rect)

plt.show()
2
ImportanceOfBeingErnest 3 नवम्बर 2018, 03:14