Pyplot.barh () के साथ प्रत्येक बार पर बार का मान कैसे प्रदर्शित करें?


105

मैंने एक बार प्लॉट तैयार किया, मैं प्रत्येक बार पर बार का मूल्य कैसे प्रदर्शित कर सकता हूं?

वर्तमान प्लॉट:

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

मैं क्या पाने की कोशिश कर रहा हूं:

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

मेरा कोड:

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

x = [u'INFO', u'CUISINE', u'TYPE_OF_PLACE', u'DRINK', u'PLACE', u'MEAL_TIME', u'DISH', u'NEIGHBOURHOOD']
y = [160, 167, 137, 18, 120, 36, 155, 130]

fig, ax = plt.subplots()    
width = 0.75 # the width of the bars 
ind = np.arange(len(y))  # the x locations for the groups
ax.barh(ind, y, width, color="blue")
ax.set_yticks(ind+width/2)
ax.set_yticklabels(x, minor=False)
plt.title('title')
plt.xlabel('x')
plt.ylabel('y')      
#plt.show()
plt.savefig(os.path.join('test.png'), dpi=300, format='png', bbox_inches='tight') # use format='svg' or 'pdf' for vectorial pictures

जवाबों:


172

जोड़ें:

for i, v in enumerate(y):
    ax.text(v + 3, i + .25, str(v), color='blue', fontweight='bold')

परिणाम:

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

Y- मान vx- स्थान और स्ट्रिंग मान दोनों के लिए हैं ax.text, और सुविधाजनक रूप से बारप्लॉट में प्रत्येक बार के लिए 1 का मीट्रिक है, इसलिए गणन iy-स्थान है।


11
शायद, उपयोग va = 'केंद्र' की जगह ले के बजाय "मैं + .25" क्षैतिज संरेखण के लिए
mathause

11
plt.text(v, i, " "+str(v), color='blue', va='center', fontweight='bold')
जोआ कार्टुचो

मैं ज्यूपिटर नोटबुक में टेक्स्ट आउटपुट को कैसे दबा सकता हूं? "," अंत में काम नहीं करता है।
राल्फ़ हुंडेवाड

अगर मैं बार के शीर्ष पर NEIGHBORHOOD प्रिंट करना चाहता हूं और सभी बॉव बार के लिए समान है, तो बाईं ओर, क्या किया जाना चाहिए। कई जगहों पर कोशिश की गई और अब तक कोई सुराग नहीं मिला।
ऋषि बंसल

@RalfHundewadt plt.show()ने अंत में एक खंड रखा । उदाहरण के लिए: df.plot(); plt.show()
जाइरो अल्वेस

36

मैंने देखा है कि एपीआई उदाहरण कोड में बार पर प्रत्येक बार पर प्रदर्शित बार के मान के साथ एक उदाहरण है:

"""
========
Barchart
========

A bar plot with errorbars and height labels on individual bars
"""
import numpy as np
import matplotlib.pyplot as plt

N = 5
men_means = (20, 35, 30, 35, 27)
men_std = (2, 3, 4, 1, 2)

ind = np.arange(N)  # the x locations for the groups
width = 0.35       # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(ind, men_means, width, color='r', yerr=men_std)

women_means = (25, 32, 34, 20, 25)
women_std = (3, 5, 2, 3, 3)
rects2 = ax.bar(ind + width, women_means, width, color='y', yerr=women_std)

# add some text for labels, title and axes ticks
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(ind + width / 2)
ax.set_xticklabels(('G1', 'G2', 'G3', 'G4', 'G5'))

ax.legend((rects1[0], rects2[0]), ('Men', 'Women'))


def autolabel(rects):
    """
    Attach a text label above each bar displaying its height
    """
    for rect in rects:
        height = rect.get_height()
        ax.text(rect.get_x() + rect.get_width()/2., 1.05*height,
                '%d' % int(height),
                ha='center', va='bottom')

autolabel(rects1)
autolabel(rects2)

plt.show()

उत्पादन:

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

FYI करें मैटलपोटलिब के "बरह" में ऊंचाई चर की इकाई क्या है? (अब तक, प्रत्येक बार के लिए एक निश्चित ऊंचाई निर्धारित करने का कोई आसान तरीका नहीं है)


1
ऐसा लगता है जैसे मूल x में दशमलव स्थान होने पर भी get_x () संख्या को गोल करता है। आपको प्रदर्शित करने के लिए अधिक दशमलव स्थान कैसे मिलते हैं?
ru111

1
पार्टी के लिए देर से लेकिन किसी और के लिए ऑटोलैबेल फ़ंक्शन में 1.05 * ऊंचाई के बजाय ऊंचाई 0.1 का उपयोग करके बार और पाठ के बीच एक सुसंगत अंतर पैदा करता है
jnPy

19

किसी को भी अपने लेबल के आधार पर उनके लेबल को इस तरह से लेबल के मान से विभाजित करना चाहिए :

for i, v in enumerate(labels):
    axes.text(i-.25, 
              v/labels[i]+100, 
              labels[i], 
              fontsize=18, 
              color=label_color_list[i])

(नोट: मैंने 100 जोड़ा है इसलिए यह बिल्कुल नीचे नहीं था)

इस तरह से परिणाम प्राप्त करने के लिए: यहां छवि विवरण दर्ज करें


निश्चित रूप से v == labels[i]और तीसरी और चौथी लाइन बस हो सकती है 101, v?
इट्नोटली।

14

मुझे पता है कि यह एक पुराना धागा है, लेकिन मैं Google के माध्यम से कई बार यहां आया हूं और सोचता हूं कि कोई जवाब नहीं दिया गया है। निम्नलिखित कार्यों में से एक का उपयोग करने का प्रयास करें:

संपादित करें : जैसे ही मुझे इस पुराने धागे पर कुछ लाइक्स मिल रहे हैं, मैं एक अपडेटेड समाधान साझा करना चाहता हूं (मूल रूप से अपने दो पिछले कार्यों को एक साथ रखकर और स्वचालित रूप से यह तय करना कि क्या यह बार या हबर प्लॉट है):

def label_bars(ax, bars, text_format, **kwargs):
    """
    Attaches a label on every bar of a regular or horizontal bar chart
    """
    ys = [bar.get_y() for bar in bars]
    y_is_constant = all(y == ys[0] for y in ys)  # -> regular bar chart, since all all bars start on the same y level (0)

    if y_is_constant:
        _label_bar(ax, bars, text_format, **kwargs)
    else:
        _label_barh(ax, bars, text_format, **kwargs)


def _label_bar(ax, bars, text_format, **kwargs):
    """
    Attach a text label to each bar displaying its y value
    """
    max_y_value = ax.get_ylim()[1]
    inside_distance = max_y_value * 0.05
    outside_distance = max_y_value * 0.01

    for bar in bars:
        text = text_format.format(bar.get_height())
        text_x = bar.get_x() + bar.get_width() / 2

        is_inside = bar.get_height() >= max_y_value * 0.15
        if is_inside:
            color = "white"
            text_y = bar.get_height() - inside_distance
        else:
            color = "black"
            text_y = bar.get_height() + outside_distance

        ax.text(text_x, text_y, text, ha='center', va='bottom', color=color, **kwargs)


def _label_barh(ax, bars, text_format, **kwargs):
    """
    Attach a text label to each bar displaying its y value
    Note: label always outside. otherwise it's too hard to control as numbers can be very long
    """
    max_x_value = ax.get_xlim()[1]
    distance = max_x_value * 0.0025

    for bar in bars:
        text = text_format.format(bar.get_width())

        text_x = bar.get_width() + distance
        text_y = bar.get_y() + bar.get_height() / 2

        ax.text(text_x, text_y, text, va='center', **kwargs)

अब आप उन्हें नियमित बार भूखंडों के लिए उपयोग कर सकते हैं:

fig, ax = plt.subplots((5, 5))
bars = ax.bar(x_pos, values, width=0.5, align="center")
value_format = "{:.1%}"  # displaying values as percentage with one fractional digit
label_bars(ax, bars, value_format)

या क्षैतिज बार भूखंडों के लिए:

fig, ax = plt.subplots((5, 5))
horizontal_bars = ax.barh(y_pos, values, width=0.5, align="center")
value_format = "{:.1%}"  # displaying values as percentage with one fractional digit
label_bars(ax, horizontal_bars, value_format)

14

Plt.text () का उपयोग करेंप्लॉट में टेक्स्ट लगाने के लिए का ।

उदाहरण:

import matplotlib.pyplot as plt
N = 5
menMeans = (20, 35, 30, 35, 27)
ind = np.arange(N)

#Creating a figure with some fig size
fig, ax = plt.subplots(figsize = (10,5))
ax.bar(ind,menMeans,width=0.4)
#Now the trick is here.
#plt.text() , you need to give (x,y) location , where you want to put the numbers,
#So here index will give you x pos and data+1 will provide a little gap in y axis.
for index,data in enumerate(menMeans):
    plt.text(x=index , y =data+1 , s=f"{data}" , fontdict=dict(fontsize=20))
plt.tight_layout()
plt.show()

यह इस प्रकार दिखाएगा:

शीर्ष पर मानों के साथ बार चार्ट


वैसे भी पाठ को बाईं ओर स्थानांतरित करने के लिए?
एस। रामजीत

1
@ एस.रामजीतplt.text(x=index , y =data+1 , s=f"{data}" , fontdict=dict(fontsize=20), va='center')
दगटनर

10

पांडा लोगों के लिए:

ax = s.plot(kind='barh') # s is a Series (float) in [0,1]
[ax.text(v, i, '{:.2f}%'.format(100*v)) for i, v in enumerate(s)];

बस। वैकल्पिक रूप से, उन लोगों के लिए जो applyएन्यूमरेट के साथ लूपिंग पसंद करते हैं :

it = iter(range(len(s)))
s.apply(lambda x: ax.text(x, next(it),'{:.2f}%'.format(100*x)));

इसके अलावा, ax.patchesआपको वह बार देगा जो आपको मिलेगा ax.bar(...)। मामले में आप @SaturnFromTitan या दूसरों की तकनीकों के कार्यों को लागू करना चाहते हैं।


कृपया जांचें कि क्या मैं उलटा नहीं हूं। शायद यह होना चाहिए[ax.text(i, v, '{:.2f}%'.format(100*v)) for i, v in enumerate(s)];
जायरो अल्वेस

@JairoAlves यह एक क्षैतिज बार प्लॉट है और v x- अक्ष पर स्थान का प्रतिनिधित्व करता है, इसलिए यह सही होना चाहिए। कृपया स्वीकृत उत्तर भी देखें।
tozCSS

पैच के साथ उदाहरण for p in ax.patches: ax.annotate(str(p.get_height()), (p.get_x() * 1.005, p.get_height() * 1.005))
इक्ता

1

मुझे बार लेबल की भी आवश्यकता थी, ध्यान दें कि मेरी y- अक्ष y अक्ष पर सीमाओं का उपयोग करके ज़ूम किया गया दृश्य है। बार के शीर्ष पर लेबल लगाने के लिए डिफ़ॉल्ट गणना अभी भी ऊंचाई का उपयोग करके काम करती है (उदाहरण में_ग्लोड_कोर्डिनेट = गलत)। लेकिन मैं यह दिखाना चाहता था कि मेटप्लोटिब 3.0.2 में वैश्विक निर्देशांक का उपयोग करके ज़ूम के दृश्य में लेबल को ग्राफ के नीचे भी रखा जा सकता है । आशा है कि यह किसी की मदद करेगा।

def autolabel(rects,data):
"""
Attach a text label above each bar displaying its height
"""
c = 0
initial = 0.091
offset = 0.205
use_global_coordinate = True

if use_global_coordinate:
    for i in data:        
        ax.text(initial+offset*c, 0.05, str(i), horizontalalignment='center',
                verticalalignment='center', transform=ax.transAxes,fontsize=8)
        c=c+1
else:
    for rect,i in zip(rects,data):
        height = rect.get_height()
        ax.text(rect.get_x() + rect.get_width()/2., height,str(i),ha='center', va='bottom')

उदाहरण आउटपुट


0

मैं स्टैक किए गए प्लॉट बार के साथ ऐसा करने की कोशिश कर रहा था। मेरे लिए काम करने वाला कोड था।

# Code to plot. Notice the variable ax.
ax = df.groupby('target').count().T.plot.bar(stacked=True, figsize=(10, 6))
ax.legend(bbox_to_anchor=(1.1, 1.05))

# Loop to add on each bar a tag in position
for rect in ax.patches:
    height = rect.get_height()
    ypos = rect.get_y() + height/2
    ax.text(rect.get_x() + rect.get_width()/2., ypos,
            '%d' % int(height), ha='center', va='bottom')

0

इस लिंक की जाँच करें Matplotlib Gallery यह मैंने ऑटोलबेल के कोड स्निपेट का उपयोग किया है।

    def autolabel(rects):
    """Attach a text label above each bar in *rects*, displaying its height."""
    for rect in rects:
        height = rect.get_height()
        ax.annotate('{}'.format(height),
                    xy=(rect.get_x() + rect.get_width() / 2, height),
                    xytext=(0, 3),  # 3 points vertical offset
                    textcoords="offset points",
                    ha='center', va='bottom')
        
temp = df_launch.groupby(['yr_mt','year','month'])['subs_trend'].agg(subs_count='sum').sort_values(['year','month']).reset_index()
_, ax = plt.subplots(1,1, figsize=(30,10))
bar = ax.bar(height=temp['subs_count'],x=temp['yr_mt'] ,color ='g')
autolabel(bar)

ax.set_title('Monthly Change in Subscribers from Launch Date')
ax.set_ylabel('Subscriber Count Change')
ax.set_xlabel('Time')
plt.show()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.