python - मैं matplotlib में पहलू अनुपात कैसे सेट कर सकते हैं?





(5)


आकर्षण के तीसरे बार। मेरा अनुमान है कि यह एक बग है और जेन्या के जवाब से पता चलता है कि यह नवीनतम संस्करण में तय है। मेरे पास संस्करण 0.9 9.1.1 है और मैंने निम्न समाधान बनाया है:

import matplotlib.pyplot as plt
import numpy as np

def forceAspect(ax,aspect=1):
    im = ax.get_images()
    extent =  im[0].get_extent()
    ax.set_aspect(abs((extent[1]-extent[0])/(extent[3]-extent[2]))/aspect)

data = np.random.rand(10,20)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data)
ax.set_xlabel('xlabel')
ax.set_aspect(2)
fig.savefig('equal.png')
ax.set_aspect('auto')
fig.savefig('auto.png')
forceAspect(ax,aspect=1)
fig.savefig('force.png')

यह 'force.png' है:

नीचे मेरे असफल, अभी तक उम्मीदवार प्रयासों के नीचे हैं।

दूसरा उत्तर:

नीचे मेरा 'मूल उत्तर' ओवरकिल है, क्योंकि यह axes.set_aspect() समान कुछ करता है। मुझे लगता है कि आप axes.set_aspect('auto') का उपयोग करना चाहते हैं। मुझे समझ में नहीं आता कि यह मामला क्यों है, लेकिन यह मेरे लिए एक वर्ग छवि साजिश पैदा करता है, उदाहरण के लिए यह स्क्रिप्ट:

import matplotlib.pyplot as plt
import numpy as np

data = np.random.rand(10,20)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data)
ax.set_aspect('equal')
fig.savefig('equal.png')
ax.set_aspect('auto')
fig.savefig('auto.png')

'बराबर' पहलू अनुपात के साथ एक छवि साजिश का उत्पादन करता है: और 'ऑटो' पहलू अनुपात वाला एक:

'मूल उत्तर' में नीचे दिया गया कोड स्पष्ट रूप से नियंत्रित पहलू अनुपात के लिए एक प्रारंभिक बिंदु प्रदान करता है, लेकिन ऐसा लगता है कि एक बार इशशो कहा जाता है।

मूल उत्तर:

यहां एक दिनचर्या का एक उदाहरण दिया गया है जो सबप्लॉट पैरामीटर को समायोजित करेगा ताकि आपको वांछित पहलू अनुपात मिल सके:

import matplotlib.pyplot as plt

def adjustFigAspect(fig,aspect=1):
    '''
    Adjust the subplot parameters so that the figure has the correct
    aspect ratio.
    '''
    xsize,ysize = fig.get_size_inches()
    minsize = min(xsize,ysize)
    xlim = .4*minsize/xsize
    ylim = .4*minsize/ysize
    if aspect < 1:
        xlim *= aspect
    else:
        ylim /= aspect
    fig.subplots_adjust(left=.5-xlim,
                        right=.5+xlim,
                        bottom=.5-ylim,
                        top=.5+ylim)

fig = plt.figure()
adjustFigAspect(fig,aspect=.5)
ax = fig.add_subplot(111)
ax.plot(range(10),range(10))

fig.savefig('axAspect.png')

यह इस तरह की एक आकृति पैदा करता है:

मैं कल्पना कर सकता हूं कि यदि आपके पास आकृति के भीतर एकाधिक सबप्लॉट हैं, तो आप प्रदान किए गए दिनचर्या में कीवर्ड पैरामीटर (प्रत्येक 1 को डिफ़ॉल्ट) के रूप में वाई और एक्स सबप्लॉट्स की संख्या शामिल करना चाहते हैं। फिर उन संख्याओं और wspace और wspace कीवर्ड का उपयोग करके, आप सभी wspace को सही पहलू अनुपात बना सकते हैं।

मैं एक वर्ग साजिश (imshow का उपयोग कर), यानी पहलू अनुपात 1: 1 बनाने की कोशिश कर रहा हूं, लेकिन मैं नहीं कर सकता। इनमें से कोई भी काम नहीं:

import matplotlib.pyplot as plt

ax = fig.add_subplot(111,aspect='equal')
ax = fig.add_subplot(111,aspect=1.0)
ax.set_aspect('equal')
plt.axes().set_aspect('equal')

ऐसा लगता है जैसे कॉल को अनदेखा किया जा रहा है (एक समस्या जो मुझे अक्सर matplotlib के साथ प्रतीत होती है)।




आप matplotlib संस्करण क्या चल रहे हैं? मुझे हाल ही में 1.1.0 अपग्रेड करना पड़ा है, और इसके साथ, add_subplot(111,aspect='equal') मेरे लिए काम करता है।




यह उत्तर यान के उत्तर पर आधारित है। यह रैखिक या लॉग-लॉग प्लॉट के लिए पहलू अनुपात निर्धारित करेगा। Axes लॉग-स्केल होने पर परीक्षण करने के लिए मैंने https://.com/a/16290035/2966723 से अतिरिक्त जानकारी का उपयोग किया है।

def forceAspect(ax,aspect=1):
    #aspect is width/height
    scale_str = ax.get_yaxis().get_scale()
    xmin,xmax = ax.get_xlim()
    ymin,ymax = ax.get_ylim()
    if scale_str=='linear':
        asp = abs((xmax-xmin)/(ymax-ymin))/aspect
    elif scale_str=='log':
        asp = abs((scipy.log(xmax)-scipy.log(xmin))/(scipy.log(ymax)-scipy.log(ymin)))/aspect
    ax.set_aspect(asp)

जाहिर है आप अपने इच्छित log किसी भी संस्करण का उपयोग कर सकते हैं, मैंने scipy उपयोग किया है, लेकिन numpy या math ठीक होना चाहिए।




आपको अंजीर के साथ प्रयास करना चाहिए। इससे मेरा काम बनता है। दस्तावेज़ों से:

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

उदाहरण का उपयोग:

  # make a figure twice as tall as it is wide
  w, h = figaspect(2.)
  fig = Figure(figsize=(w,h))
  ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
  ax.imshow(A, **kwargs)

  # make a figure with the proper aspect for an array
  A = rand(5,3)
  w, h = figaspect(A)
  fig = Figure(figsize=(w,h))
  ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
  ax.imshow(A, **kwargs)

संपादित करें: मुझे यकीन नहीं है कि आप क्या खोज रहे हैं। उपर्युक्त कोड कैनवास (साजिश का आकार) बदलता है। यदि आप आकृति के matplotlib विंडो का आकार बदलना चाहते हैं, तो इसका उपयोग करें:

In [68]: f = figure(figsize=(5,1))

यह 5x1 (wxh) की खिड़की का उत्पादन करता है।




पायथन 3.6 के रूप में अंतर्निहित निर्देश का आदेश दिया जाएगा

अच्छी खबर है, इसलिए मैपिंग जोड़े के ओपी का मूल उपयोग केस अद्वितीय स्ट्रिंग आईडी के साथ डेटाबेस से पुनर्प्राप्त किया गया है, जिसमें अंतर्निहित पायथन v3.6 + dict में मान के रूप में कुंजी और संख्यात्मक मान हैं, अब डालने के क्रम का सम्मान करना चाहिए।

यदि डेटाबेस क्वेरी से परिणामस्वरूप दो कॉलम तालिका अभिव्यक्तियां कहें:

SELECT a_key, a_value FROM a_table ORDER BY a_value;

दो पायथन tuples, k_seq और v_seq में संग्रहित किया जाएगा (संख्यात्मक सूचकांक द्वारा गठबंधन और पाठ्यक्रम की एक ही लंबाई के साथ), फिर:

k_seq = ('foo', 'bar', 'baz')
v_seq = (0, 1, 42)
ordered_map = dict(zip(k_seq, v_seq))

बाद में आउटपुट करने की अनुमति दें:

for k, v in ordered_map.items():
    print(k, v)

इस मामले में उपज (नए पायथन 3.6+ के लिए अंतर्निहित dict!):

foo 0
bar 1
baz 42

वी के प्रति मान एक ही क्रम में।

पाइथन 3.5 में जहां मेरी मशीन पर स्थापित होता है, वर्तमान में यह उपज करता है:

bar 1
foo 0
baz 42

विवरण:

जैसा कि 2012 में रेमंड हेटिंगर द्वारा प्रस्तावित किया गया था (विषय के साथ पाइथन-देव पर सीएफ मेल "तेजी से पुनरावृत्ति के साथ अधिक कॉम्पैक्ट शब्दकोश" ) और अब (2016 में) विक्टर स्टिनर द्वारा एक मेल में घोषणा की गई जिसमें पाइथन-डेव विषय के साथ "पायथन 3.6 dict बन गया कॉम्पैक्ट और एक निजी संस्करण प्राप्त होता है; और कीवर्ड " 27350 के फिक्स / कार्यान्वयन के कारण " आदेश दिया जाता है " पाइथन 3.6 में कॉम्पैक्ट और ऑर्डर किया गया" हम अब डालने के आदेश को बनाए रखने के लिए एक अंतर्निहित निर्देश का उपयोग करने में सक्षम होंगे !!

उम्मीद है कि इससे पहले चरण के रूप में ऑर्डर्ड डिक्ट कार्यान्वयन की पतली परत होगी। जैसा कि @ जिमफसारकिस-हिलियार्ड ने इंगित किया है, कुछ भविष्य में ऑर्डर्ड डिक्ट प्रकार के लिए भी उपयोग मामलों को देखते हैं। मुझे लगता है कि बड़े पैमाने पर पाइथन समुदाय सावधानी से निरीक्षण करेगा, अगर यह समय की परीक्षा खड़ा होगा, और अगले कदम क्या होंगे।

स्थिर कोडिंग द्वारा खोले गए संभावनाओं को याद न करने के लिए हमारी कोडिंग आदतों पर पुनर्विचार करने का समय:

  • कीवर्ड तर्क और
  • (मध्यवर्ती) dict भंडारण

पहला क्योंकि यह कुछ मामलों में कार्यों और विधियों के कार्यान्वयन में प्रेषण को आसान बनाता है।

दूसरी बात यह है कि यह पाइपलाइनों को संसाधित करने में मध्यवर्ती भंडारण के रूप में अधिक आसानी से उपयोग करने के लिए प्रोत्साहित करती है।

रेमंड हेटिंगर ने कृपया अपने सैन फ्रांसिस्को पायथन मीटुप ग्रुप प्रेजेंटेशन 2016-डीईसी -08 से " टेक टेक पाइथन 3.6 डिक्शनरी " के बारे में बताते हुए दस्तावेज प्रदान किया।

और शायद कुछ स्टैक ओवरफ्लो उच्च सजाए गए प्रश्न और उत्तर पृष्ठों को इस जानकारी के वेरिएंट प्राप्त होंगे और कई उच्च गुणवत्ता वाले उत्तरों के लिए प्रति संस्करण अपडेट की भी आवश्यकता होगी।

चेतावनी एम्प्टर (लेकिन नीचे 2017-12-15 अपडेट देखें):

जैसा कि @ajcr सही ढंग से नोट करता है: "इस नए कार्यान्वयन के आदेश-संरक्षण पहलू को कार्यान्वयन विवरण माना जाता है और इस पर भरोसा नहीं किया जाना चाहिए।" ( whatsnew36 से ) नाइट पिकिंग नहीं, लेकिन उद्धरण थोड़ा निराशाजनक कटौती की गई थी ;-)। यह जारी है "(यह भविष्य में बदल सकता है, लेकिन यह सभी मौजूदा और भविष्य के पायथन कार्यान्वयन के लिए क्रमशः अर्थशास्त्र को संरक्षित करने के लिए भाषा की कल्पना को बदलने से पहले कुछ रिलीज के लिए भाषा में इस नए dict कार्यान्वयन को वांछित करना चाहता है; यह भी भाषा के पुराने संस्करणों के साथ पिछड़ा-संगतता को संरक्षित रखने में मदद करता है जहां यादृच्छिक पुनरावृत्ति आदेश अभी भी प्रभावी है, उदाहरण के लिए पायथन 3.5)। "

इसलिए कुछ मानव भाषाओं (जैसे जर्मन) में, उपयोग भाषा को आकार देता है, और अब इच्छा घोषित कर दी गई है ... whatsnew36 में

2017-12-15 अपडेट करें:

पाइथन-देव सूची के लिए एक मेल में , गिडो वैन रॉसम ने घोषित किया:

इसे ऐसा बनाओ। "डिकट सम्मिलन आदेश रखता है" सत्तारूढ़ है। धन्यवाद!

तो, संस्करण प्रविष्टि आदेश का संस्करण 3.6 सीपीथन दुष्प्रभाव अब भाषा विशिष्टता का हिस्सा बन रहा है (और अब केवल एक कार्यान्वयन विस्तार नहीं)। उस मेल थ्रेड ने collections.OrderedDict लिए कुछ विशिष्ट डिजाइन लक्ष्यों को भी सामने लाया। ऑर्डर्ड डिक्टरी के दौरान रेमंड हेटिंगर द्वारा याद दिलाया गया।





python matplotlib