2012-01-16 9 views
13

में log2 तराजू मैं matplotlib के साथ एक वर्ग अक्ष बिखराव साजिश करना चाहते हैं के साथ साजिश अक्ष। आम तौर पर set_scale("log") का उपयोग करना बहुत अच्छा काम करता है, लेकिन यह मुझे लॉग 10 तक सीमित करता है। मैं प्लॉट 2 में साजिश बनाना चाहता हूं। मैंने यहां समाधान देखा: How to produce an exponentially scaled axis?बनाने वर्ग matplotlib

लेकिन यह काफी जटिल है और यदि आपके पास आपके सरणी में 0 मान हैं, तो यह काम नहीं करता है। मैं बस अन्य numpy कार्यों की तरह उन लोगों को अनदेखा करना चाहता हूं।

उदाहरण के लिए:

log2scatter(data1, data2) 

जहां data1 और data2 0s शामिल x और y अक्ष पर एक लघुगणकीय पैमाने, लघुगणक दूरी पर टिक के साथ होना चाहिए। बस log10, log2 छोड़कर ...

धन्यवाद की तरह।

+0

लॉग्स केवल सकारात्मक बहस के लिए परिभाषित कर रहे हैं। इस आधार पर ध्यान दिए बिना रखती है, अर्थात यह, प्राकृतिक लॉग के लिए रखती है log base 10, लॉग आधार 2 आदि इसलिए तुम सिर्फ कुछ है, जो एक logscale में शून्य है जब तक आप इन शून्य मान के लिए कुछ करना साजिश नहीं कर सकते। –

+0

उस सवाल से जवाब का प्रयोग करें, लेकिन पहले को फ़िल्टर y- मानों कि 0 और उनकी संगत एक्स मूल्यों (कि कैसे numpy उन्हें वैसे भी ध्यान नहीं देता है)। –

+0

numpy में ऐसा करने के लिए एक शानदार तरीका क्या है? फ़िल्टरिंग कोड को जटिल करती है क्योंकि अब मेरे पास सरणी की एक प्रतिलिपि है, और एक प्रति फ़िल्टर की गई है ... – user248237dfsf

उत्तर

28

बस basex=2 या basey=2 निर्दिष्ट करें।

import matplotlib.pyplot as plt 

fig, ax = plt.subplots() 
ax.set_xscale('log', basex=2) 
ax.set_yscale('log', basey=2) 

ax.plot(range(1024)) 
plt.show() 

enter image description here

शून्य पार व्यवहार के लिए, क्या आप की बात कर रहे हैं "सममित प्रवेश करें" साजिश (यानी "symlog") है। जो भी इसके लायक है, डेटा फ़िल्टर नहीं किया गया है, यह सिर्फ 0 के पास एक रैखिक साजिश है और हर जगह लॉग प्लॉट है। यह वह स्तर है जो डेटा को बदलता है।

आम तौर पर आप सिर्फ ax.set_xscale('symlog', basex=2) करते हैं, लेकिन एक गैर 10 आधार का उपयोग कर symlog भूखंडों के लिए इस समय गाड़ी प्रतीत होता है।

संपादित करें: हे! बग क्लासिक गलती के कारण प्रतीत होता है: एक परिवर्तनीय डिफ़ॉल्ट तर्क का उपयोग करना।
मैंने एक बग रिपोर्ट दायर की है, लेकिन यदि आप इसे ठीक करने की तरह महसूस करते हैं, तो आपको SymmetricalLogLocator की विधि में , लाइन 1376 के आसपास, मामूली संपादन करने की आवश्यकता होगी।

इसके बजाय

def __init__(self, transform, subs=[1.0]): 
    self._transform = transform 
    self._subs = subs 
    ... 

को कुछ इसी तरह करने के लिए यह परिवर्तन की: बनाया कि परिवर्तन के साथ

def __init__(self, transform, subs=None): 
    self._transform = transform 
    if subs is None: 
     self._subs = [1.0] 
    else: 
     self._subs = subs 
    .... 

, यह उम्मीद करती है ...

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots() 
ax.set_xscale('symlog', basex=2) 
ax.set_yscale('symlog', basey=2) 

x = np.arange(-1024, 1024) 
ax.plot(x, x) 

plt.show() 

enter image description here

+0

मुझे बेस = 2 (और वास्तव में इसके बिना भी) का उपयोग करके वास्तव में अजीब डिफ़ॉल्ट एक्स और वाई सीमाएं मिलती हैं। यह इसे किसी भी आयाम में सबसे छोटे मानों के रूप में सेट नहीं करता है। यह वास्तव में अजीब सीमाएं चुनता है जो अधिकांश डेटा को छुपाते हैं। यह x/y सीमाओं को मैन्युअल रूप से सेट करने से अलग कैसे किया जा सकता है? – user248237dfsf

+0

लॉग 2 बनाम लॉग 2 में एक फ्रीकिन 'स्कैटर प्लॉट बनाने के लिए matplotlib में एक वर्ग को ओवरराइड/हैक करना नहीं चाहिए ... यह बहुत दुखी और निराशाजनक है। :( – user248237dfsf

+0

symlog भाग एक बग है। जिस सीमा का आप उल्लेख कर रहे हैं वह वही तरीका है जो लॉग प्लॉट के लिए व्यवहार करता है। वे आधार की निकटतम शक्ति को "स्नैप" करते हैं। अगर आप सीमाओं को सख्ती से खत्म करना चाहते हैं डेटा का न्यूनतम और अधिकतम, फिर 'ax.axis (' tight ') निर्दिष्ट करें। –

2

आप plt.xscale का उपयोग कर रहे हैं, तो आप अभी भी basex, नहीं base निर्दिष्ट करना होगा:

plt.figure() 
plt.plot(x, y) 
plt.xscale('log', basex=2) 
plt.show()