मुझे पता है कि यह धागा अब लंबे समय से मर चुका है, लेकिन मुझे लगता है कि मेरा समाधान पोस्ट करना किसी और के लिए उपयोगी हो सकता है कि लॉग-स्केल प्लॉट्स पर कुशलतापूर्वक तीरों को कैसे आकर्षित किया जाए।
अन्य लोगों द्वारा पहले से पोस्ट किए जाने के विकल्प के रूप में, आप मूल अक्षों के पैमाने पर नहीं बल्कि तीर निर्देशांक के (रैखिक) पैमाने में तीर निर्देशांक इनपुट करने के लिए 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')
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
तो क्या कोई कामकाज है? – janoliver
यदि मुझे किसी के बारे में पता है तो मैंने एक उत्तर लिखा होगा ;-)। लेकिन अब कम से कम आप जानते हैं कि तीर है ... – joaquin