2012-08-02 26 views
8

में एक ऊर्ध्वाधर तीर ड्रा मैं निम्नलिखित लॉग-लॉग साजिश में एक सरल, ऊर्ध्वाधर तीर आकर्षित करने के लिए सक्षम नहीं हूँ:matplotlib: एक लॉग-लॉग साजिश

#!/usr/bin/python2 

import matplotlib.pyplot as plt 
import matplotlib as mpl 

plt.yscale('log') 
plt.xscale('log') 
plt.ylim((1e-20,1e-10)) 
plt.xlim((1e-12,1)) 

plt.arrow(0.00006666, 1e-20, 0, 1e-8 - 1e-20, length_includes_head=True) 

plt.savefig('test.pdf') 

यह सिर्फ नहीं दिखाता है। प्रलेखन से ऐसा लगता है जैसे धुरी के पैमाने से संबंधित सभी तर्क, चौड़ाई, ऊंचाई और इतने पर। यह बहुत प्रतिद्वंद्वी है। मैंने तीर के पैरामीटर पर अधिक नियंत्रण रखने के लिए (0,1), (0,1) सीमाओं के साथ मेरी शीर्ष पर एक अक्ष को परिभाषित करने के लिए अक्षांशवादी पैकेज के twin() का उपयोग करने का प्रयास किया, लेकिन मैं यह नहीं समझ पाया कि प्राथमिक व्यक्ति के शीर्ष पर पूरी तरह से स्वतंत्र अक्ष कैसे है ।

कोई भी विचार?

+1

matplotlib के साथ एक समस्या प्रतीत होता है। 'Plt.arrow (6e-4, 1e-4, 0.1, 0.2, length_includes_head = True) 'आज़माएं और दृश्य को y के उच्च मानों को ले जाएं। आपको तीर रेखा लगभग 10-4 से शुरू होगी। हालांकि यदि आप निम्न मानों का उपयोग करते हैं (यानी x और y के लिए 1e-5) रेखा गायब हो जाती है और आप पहले से ही उसी स्थान पर केवल छोटे तीर सिर को देख सकते हैं। (जाहिर है, आपको ऐसा करने के लिए plt.show() का उपयोग करना चाहिए) – joaquin

+0

तो क्या कोई कामकाज है? – janoliver

+0

यदि मुझे किसी के बारे में पता है तो मैंने एक उत्तर लिखा होगा ;-)। लेकिन अब कम से कम आप जानते हैं कि तीर है ... – joaquin

उत्तर

4

subplots

दृष्टिकोण subplots बनाने निम्नलिखित

  • अक्ष बंद करने के लिए पदों
  • उपयोग set_axis_off() संरेखित है के बाद (टिक्स, लेबल, आदि)
  • ड्रा तीर!

तो कुछ पंक्तियां आपको मिलती हैं!

उदा।

#!/usr/bin/python2 

import matplotlib.pyplot as plt 

hax = plt.subplot(1,2,1) 
plt.yscale('log') 
plt.xscale('log') 
plt.ylim((1e-20,1e-10)) 
plt.xlim((1e-12,1)) 

hax2 = plt.subplot(1,2,2) 
plt.arrow(0.1, 1, 0, 1, length_includes_head=True) 

hax.set_position([0.1, 0.1, 0.8, 0.8]) 
hax2.set_position([0.1, 0.1, 0.8, 0.8]) 

hax2.set_axis_off() 

plt.savefig('test.pdf') 

Rescale डेटा

वैकल्पिक रूप से एक संभवतः आसान दृष्टिकोण, हालांकि अक्ष लेबल मुश्किल हो सकता है, डेटा rescale है।

अर्थात

import numpy 

# Other import commands and data input 

plt.plot(numpy.log10(x), numpy.log10(y))) 

नहीं एक महान समाधान है, लेकिन एक सभ्य परिणाम अगर आप टिक लेबल संभाल कर सकते हैं!

+0

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

+0

ओवरले। मैं एक दूसरे के शीर्ष पर दो पूरी तरह से स्वतंत्र भूखंडों का पता नहीं लगा सकता, प्रत्येक का अपना एक्स और वाई अक्ष है और इसी तरह। – janoliver

+0

तो क्यों न केवल 'लॉग (x)' और 'लॉग (y) 'की रैखिक साजिश करें? यह तीर तुच्छ ड्राइंग बनाता है। – jmetz

5

मैं इस प्रश्न का उत्तर ढूंढ रहा था, और एक उपयोगी उत्तर मिला! आप मार्कर के रूप में किसी भी "मैथटेक्स्ट" वर्ण (लाटेक्स का मैटलप्लिब संस्करण) निर्दिष्ट कर सकते हैं। आज़माएं: plt.plot (x, y, 'ko', marker = r '$ \ downarrow $', markersize = 20)

यह नीचे की ओर इशारा करेगा, स्थिति पर काला तीर (x, y) किसी भी साजिश पर भी अच्छा लग रहा है (यहां तक ​​कि लॉग-लॉग)। देखें: matplotlib.org/users/mathtext.html#mathtext- अधिक प्रतीकों के लिए ट्यूटोरियल जिसका आप उपयोग कर सकते हैं।

1

मुझे पता है कि यह धागा अब लंबे समय से मर चुका है, लेकिन मुझे लगता है कि मेरा समाधान पोस्ट करना किसी और के लिए उपयोगी हो सकता है कि लॉग-स्केल प्लॉट्स पर कुशलतापूर्वक तीरों को कैसे आकर्षित किया जाए।

अन्य लोगों द्वारा पहले से पोस्ट किए जाने के विकल्प के रूप में, आप मूल अक्षों के पैमाने पर नहीं बल्कि तीर निर्देशांक के (रैखिक) पैमाने में तीर निर्देशांक इनपुट करने के लिए transformation object का उपयोग कर सकते हैं। अक्ष समन्वय द्वारा मेरा क्या मतलब है वे [0,1] (क्षैतिज रेंज) [0,1] (लंबवत रेंज) द्वारा सामान्यीकृत होते हैं, जहां बिंदु (0,0) नीचे-बाएं कोने और बिंदु होगा (1,1) शीर्ष दाएं होगा, और इसी तरह।तो फिर तुम बस द्वारा एक तीर शामिल हो सकते हैं:

plt.arrow(0.1, 0.1, 0.9, 0.9, transform=plot1.transAxes, length_includes_head=True) 

यह एक तीर कि तिरछे भूखंड की क्षैतिज और ऊर्ध्वाधर श्रृंखला के 4/5 से अधिक तक फैला देता है, से नीचे बाईं ओर शीर्ष सही करने के लिए (जहां plot1 है सबप्लॉट नाम)।

आप सामान्य, जहां सटीक (x0,y0) और लॉग-अंतरिक्ष में (x1,y1) निर्देशांक तीर के लिए निर्दिष्ट किया जा सकता में ऐसा करना चाहते हैं, तो यह भी मुश्किल नहीं है अगर आप दो कार्यों fx(x) और fy(y) कि मूल निर्देशांक से परिणत बारे में इन "axes" निर्देशांक के लिए। मैंने ओपी द्वारा पोस्ट किया गया मूल कोड नीचे दिए गए कार्यान्वयन के लिए संशोधित किया जा सकता है (कोड बनाने वाली छवियों को शामिल करने के लिए क्षमा नहीं, मेरे पास अभी तक आवश्यक प्रतिष्ठा नहीं है)।

#!/usr/bin/python3 

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib as mpl 

# functions fx and fy take log-scale coordinates to 'axes' coordinates 
ax = 1E-12 # [ax,bx] is range of horizontal axis 
bx = 1E0 
def fx(x): 
    return (np.log(x) - np.log(ax))/(np.log(bx) - np.log(ax)) 

ay = 1E-20 # [ay,by] is range of vertical axis 
by = 1E-10 
def fy(y): 
    return (np.log(y) - np.log(ay))/(np.log(by) - np.log(ay)) 

plot1 = plt.subplot(111) 
plt.xscale('log') 
plt.yscale('log') 
plt.xlim(ax, bx) 
plt.ylim(ay, by) 

# transformed coordinates for arrow from (1E-10,1E-18) to (1E-4,1E-16) 
x0 = fx(1E-10) 
y0 = fy(1E-18) 
x1 = fx(1E-4) - fx(1E-10) 
y1 = fy(1E-16) - fy(1E-18) 

plt.arrow(
      x0, y0, x1, y1, # input transformed arrow coordinates 
      transform = plot1.transAxes, # tell matplotlib to use axes coordinates 
      facecolor = 'black', 
      length_includes_head=True 
     ) 

plt.grid(True) 
plt.savefig('test.pdf') 
संबंधित मुद्दे