Matplotlib में 2 की शक्ति के रूप में टिक स्केल कैसे सेट करें? [डुप्लीकेट]

Dec 16 2020

मैं एक आंकड़े की साजिश करना चाहता हूं, जिसका xtick मान 2 की शक्ति पर बढ़ता है।

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

import pandas as pd
data = pd.DataFrame({
    'x': [2, 4, 8, 16, 32, 64],
    'y': [1, 2, 3, 4, 5, 6]
})

मुझे उम्मीद है कि इस तरह एक आंकड़ा है,

ऊपर के नमूने की तरह साफ-सुथरे डेटा के लिए, मैं x2इस डेटाफ्रेम में केवल 1 ~ 6 का एक सहायक कॉलम बना सकता हूं और फिर आकृति के xticklabels को 2 ^ 1 ~ 2 ^ 6 पर सेट कर सकता हूं। हालाँकि, यह समाधान 3, 7 या 30 जैसे अन्य मानों वाली स्थितियों पर लागू नहीं होता है।

ऐसा लगता है कि matplotlib केवल एक लॉग स्केल का समर्थन करता है। मैं 2 के पावर स्केल के साथ एक टिक कैसे प्राप्त कर सकता हूं?

जवाब

max Dec 16 2020 at 17:20

यह एक विशेष रूप से ट्रिक प्रश्न है (जो मुझे ^ ^ होने की उम्मीद नहीं थी)।

ठीक है, चलो पढ़ने के लिए कुछ संकेत के साथ शुरू करते हैं: आप x / y स्केल सेट करना चाहते हैं: .matplotlib.axes.Axes.set_yscale () । हालांकि, मानक तराजू के कुछ जोड़े हैं (डिफ़ॉल्ट रूप से स्पष्ट रूप से 'liner', कोई कस्टम स्केल सेट कर सकता है। यहां कुछ अच्छे उदाहरण हैं।

मूल रूप से, आप आगे के परिवर्तन के साथ और इसके व्युत्क्रम के साथ दो कार्यों को परिभाषित करते हैं। बाद में आपको टिक्स को सही तरीके से सेट करने की आवश्यकता है (क्योंकि आप प्लॉटिंग के बाद ट्रांसफ़ॉर्मेशन लागू करते हैं , टिक्स समान रहते हैं (लेकिन ट्रांसफ़ॉर्मेशन के कारण उसी स्थिति में नहीं)। इसके लिए एक दो विकल्प हैं:

  • मैन्युअल रूप से टिक्स सेट करना matplotlib.axes.Axes.set_xticks(), या
  • अक्ष के लोकेटर को सेट करके matplotlib.axes.Axes.xaxis.set_major_locator():। यदि आप ग्रिड का उपयोग करते हैं तो यह अनुशंसित है। लेकिन जैसा कि मेरा ज्ञान सीमित है, मैं एक अधिक विस्तृत स्पष्टीकरण की सराहना करता हूं (क्योंकि अब मैं इस सुविधा के बारे में भी उत्सुक हूं ^ ^)

और अब मुश्किल हिस्सा आता है: एक का प्रतिनिधित्व करने के लिए टिक-लेबल को स्वरूपित करना '2^x'। मैं उन्हें स्ट्रिंग्स के रूप में स्पष्ट रूप से सेट करने से बेहतर विचार नहीं आया। ऐसा लगता है कि कोई व्यक्ति केवल सीमित सीमाओं के भीतर ही सामान्य प्रारूप को बदल सकता है, देख matplotlib.pyplot.ticklabel_format()सकता है कि कोई व्यक्ति वैज्ञानिक नोटेशन का उपयोग और कब कर सकता है (यानी '10^x'नीचे दाईं ओर प्रदर्शित )। मुझे बताएं कि क्या इसके लिए अधिक सामान्य समाधान है।

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.ticker import FixedLocator

# create dummy data
df = pd.DataFrame({
    'x': [2**x for x in range(1,10)],
    'y': list(range(1,10))
})

def forward(x):
    return np.log2(x)


def inverse(x):
    return 2**x

# open figure
fig, ax = plt.subplots(2,2)
axs = ax.flatten()
for i in range(0,4):
    # plot data
    axs[i].plot(df['x'],df['y'])
    if i > 0:
        # set scale function
        axs[i].set_xscale('function', functions=(forward,inverse))
    if i > 1:
        # set ticks
        # - OPTION 1
        axs[i].set_xticks(df['x'])
        # - OPTION 2
      axs[i].xaxis.set_major_locator(FixedLocator(2**np.arange(1,10)))
    if i > 2:
        # est tick labels
        axs[i].set_xticklabels( [f"2^{j:.0f}" for j in np.log2(df['x'])] )

plt.show()