प्रतिशत के रूप में प्रारूप y अक्ष


114

मेरे पास एक मौजूदा भूखंड है जो पांडा के साथ इस तरह बनाया गया था:

df['myvar'].plot(kind='bar')

Y अक्ष फ्लोट के रूप में प्रारूपित है और मैं y अक्ष को प्रतिशत में बदलना चाहता हूं। मेरे द्वारा पाए गए सभी समाधानों में ax.xyz सिंटैक्स का उपयोग किया गया है और मैं केवल ऊपर की रेखा के नीचे कोड रख सकता हूं जो कि कथानक बनाता है (मैं ax = ax को ऊपर की पंक्ति में नहीं जोड़ सकता।)

ऊपर की लाइन को बदले बिना मैं y अक्ष को प्रतिशत के रूप में कैसे प्रारूपित कर सकता हूं?

यहाँ समाधान है जो मैंने पाया है लेकिन इसके लिए आवश्यक है कि मैं इस कथानक को फिर से परिभाषित करूँ :

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.ticker as mtick

data = [8,12,15,17,18,18.5]
perc = np.linspace(0,100,len(data))

fig = plt.figure(1, (7,4))
ax = fig.add_subplot(1,1,1)

ax.plot(perc, data)

fmt = '%.0f%%' # Format you want the ticks, e.g. '40%'
xticks = mtick.FormatStrFormatter(fmt)
ax.xaxis.set_major_formatter(xticks)

plt.show()

उपरोक्त समाधान के लिए लिंक: पायलॉट: एक्स अक्ष पर प्रतिशत का उपयोग करना


क्या आप कृपया matplotlib में मूल रूप से लागू दृष्टिकोण के लिए अपना स्वीकृत उत्तर बदल सकते हैं? stackoverflow.com/a/36319915/1840471
मैक्स गनीस

जवाबों:


128

यह कुछ महीने की देर है, लेकिन मैंने नई क्लास को जोड़ने के लिए matplotlib के साथ PR # 6251 बनाया है PercentFormatter। इस वर्ग के साथ आपको अपनी धुरी को पुन: स्वरूपित करने के लिए केवल एक पंक्ति की आवश्यकता है (दो यदि आप आयात को गिनते हैं matplotlib.ticker):

import ...
import matplotlib.ticker as mtick

ax = df['myvar'].plot(kind='bar')
ax.yaxis.set_major_formatter(mtick.PercentFormatter())

PercentFormatter()तीन तर्कों को स्वीकार करता है, , xmax, ।decimals आपको अक्ष पर 100% से संबंधित मान सेट करने की अनुमति देता है। यह अच्छा है अगर आपके पास 0.0 से 1.0 तक डेटा है और आप इसे 0% से 100% तक प्रदर्शित करना चाहते हैं। बस करो ।symbolxmaxPercentFormatter(1.0)

अन्य दो पैरामीटर आपको दशमलव बिंदु और प्रतीक के बाद अंकों की संख्या निर्धारित करने की अनुमति देते हैं। वे क्रमशः, Noneऔर डिफ़ॉल्ट रूप से '%'decimals=Noneआपके द्वारा दिखाए जा रहे कुल्हाड़ियों के आधार पर दशमलव अंकों की संख्या को स्वचालित रूप से निर्धारित करेगा।

अपडेट करें

PercentFormatter संस्करण 2.1.0 में उचित रूप से Matplotlib में पेश किया गया था।


@MateenUlhaq कृपया अपने संपादन में महत्वपूर्ण कोड संशोधनों का परिचय न दें। आपने बिना किसी आवश्यकता के मेरे उत्तर में कोड दोहराया। यह एक अच्छा संपादन नहीं था।
मैड फिजिसिस्ट

मेरा बुरा, कुछ अजीब कारण के लिए, मैंने पढ़ा है कि के रूप में from matplotlib.ticker import mtickऔर मान लिया mtick"मॉड्यूल" हटा दिया गया था।
मतीन उल्हाक

125

पांडा डेटाफ्रेम प्लॉट axआपके लिए वापस आ जाएगा , और फिर आप जो चाहें कुल्हाड़ियों में हेरफेर करना शुरू कर सकते हैं।

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(100,5))

# you get ax from here
ax = df.plot()
type(ax)  # matplotlib.axes._subplots.AxesSubplot

# manipulate
vals = ax.get_yticks()
ax.set_yticklabels(['{:,.2%}'.format(x) for x in vals])

यहां छवि विवरण दर्ज करें


5
जैसे ही आप ग्राफ को इंटरेक्टिव रूप से पैन / जूम करेंगे, इसका अवांछित प्रभाव होगा
हिट जॉग

3
matplotlib.tickerफ़ंक्शन फॉर्मेटर्स का उपयोग करने की तुलना में मिलियन गुना आसान है !
जारद

फिर आप (0,100%) कहने के लिए y अक्ष को कैसे सीमित करते हैं? मैंने ax.set_ylim (0,100) की कोशिश की, लेकिन वह काम नहीं करता है !!
मप्र

@ केवल yticks के लेबल बदले जाते हैं, इसलिए सीमाएँ अभी भी प्राकृतिक इकाइयों में हैं। Ax.set_ylim (0, 1) सेट करने पर ट्रिक आ जाएगी।
जोरान

79

Jianxun के समाधान ने मेरे लिए काम किया लेकिन खिड़की के नीचे बाईं ओर y मूल्य सूचक को तोड़ दिया।

मैं का उपयोग कर समाप्त हो गया FuncFormatterबजाय (और के रूप में सुझाव भी uneccessary अनुगामी शून्य छीन यहाँ ):

import pandas as pd
import numpy as np
from matplotlib.ticker import FuncFormatter

df = pd.DataFrame(np.random.randn(100,5))

ax = df.plot()
ax.yaxis.set_major_formatter(FuncFormatter(lambda y, _: '{:.0%}'.format(y))) 

आम तौर पर बोलना मैं FuncFormatterलेबल स्वरूपण के लिए उपयोग करने की सलाह दूंगा: यह विश्वसनीय और बहुमुखी है।

यहां छवि विवरण दर्ज करें


19
आप कोड को और भी सरल बना सकते हैं ax.yaxis.set_major_formatter(FuncFormatter('{0:.0%}'.format)):। AKA को लैम्ब्डा की कोई आवश्यकता नहीं है, प्रारूप को कार्य करने दें।
डैनियल हिममेलस्टीन

@DanielHimmelstein क्या आप इसे थोड़ा समझा सकते हैं? विशेष रूप से {} के अंदर। निश्चित नहीं है कि मेरे 0.06 को अजगर प्रारूप के साथ 6% में बदल दिया गया है। इसके अलावा महान समाधान। .Set_ticklabels का उपयोग करने की तुलना में बहुत अधिक मज़बूती से काम करने लगता है
डीसीपीस

3
@ डुप्लिकेट्स '{0:.0%}'.formatएक स्वरूपण फ़ंक्शन बनाता है । इससे 0पहले कि बृहदान्त्र फॉर्मेटर को कर्ली-कोष्ठक और उसकी सामग्री को प्रतिस्थापित करने के लिए कहता है, जो पहले तर्क के साथ फ़ंक्शन में जाता है। बृहदान्त्र के बाद का हिस्सा .0%, फॉर्मेटर को बताता है कि मूल्य कैसे प्रस्तुत करना है। .00 दशमलव स्थानों है और निर्दिष्ट %एक प्रतिशत के रूप में प्रतिपादन निर्दिष्ट।
डैनियल हिमेलस्टीन

31

उन लोगों के लिए जो एक लाइनर की तलाश कर रहे हैं:

plt.gca().set_yticklabels(['{:.0f}%'.format(x*100) for x in plt.gca().get_yticks()]) 

या यदि आप लेटेक्स को अक्ष टेक्स्ट फॉर्मेटर के रूप में उपयोग कर रहे हैं , तो आपको एक बैकस्लैश '\' जोड़ना होगा

plt.gca().set_yticklabels(['{:.0f}\%'.format(x*100) for x in plt.gca().get_yticks()]) 

मेरे लिए, डैनियल हिममेलस्टीन के उत्तर ने काम किया जबकि इस उत्तर ने पैमाने को बदल दिया
आर। कॉक्स

2

मैं एक वैकल्पिक विधि का उपयोग कर प्रस्ताव करता हूं seaborn

काम कोड:

import pandas as pd
import seaborn as sns
data=np.random.rand(10,2)*100
df = pd.DataFrame(data, columns=['A', 'B'])
ax= sns.lineplot(data=df, markers= True)
ax.set(xlabel='xlabel', ylabel='ylabel', title='title')
#changing ylables ticks
y_value=['{:,.2f}'.format(x) + '%' for x in ax.get_yticks()]
ax.set_yticklabels(y_value)

यहां छवि विवरण दर्ज करें


0

मुझे खेल में देरी हो रही है, लेकिन मुझे अभी इस बात का अहसास है: इससे axबदला जा सकता हैplt.gca() उन लोगों के जो कुल्हाड़ियों और सिर्फ सबप्लॉट्स का उपयोग नहीं कर रहे हैं।

पैकेज का उपयोग करते हुए, PercentFormatterयह होगा:

import matplotlib.ticker as mtick

plt.gca().yaxis.set_major_formatter(mtick.PercentFormatter(1))
#if you already have ticks in the 0 to 1 range. Otherwise see their answer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.