¿Cómo anotar barras en Barplot con Matplotlib en Python?

Anotación significa agregar notas a un diagrama indicando qué valores representa. A menudo resulta tedioso para el usuario leer los valores del gráfico cuando el gráfico está reducido o está demasiado poblado. En este artículo, discutiremos cómo anotar los diagramas de barras creados en python usando la biblioteca matplotlib .

Los siguientes son ejemplos de gráficos de barras anotados y no anotados:

Gráfica de barras no anotada vs anotada

Enfoque paso a paso:

  • Primero tracemos gráficos simples a partir de un marco de datos de Pandas, por lo que ahora tenemos listo el siguiente marco de datos:

Python3

# Importing libraries for dataframe creation
# and graph plotting
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
 
# Creating our own dataframe
data = {"Name": ["Alex", "Bob", "Clarein", "Dexter"],
        "Marks": [45, 23, 78, 65]}
 
# Now convert this dictionary type data into a pandas dataframe
# specifying what are the column names
df = pd.DataFrame(data, columns=['Name', 'Marks'])

Producción:

Marco de datos de pandas generado por el usuario

  • Ahora comencemos a trazar el marco de datos usando la biblioteca seaborn . Obtenemos los siguientes resultados. Pero no es muy visible cuáles son los valores reales en los gráficos de barras. Esta condición también puede presentarse cuando los valores de las parcelas vecinas son bastante cercanos entre sí.

Python3

# Defining the plotsize
plt.figure(figsize=(8, 6))
 
# Defining the x-axis, the y-axis and the data
# from where the values are to be taken
plots = sns.barplot(x="Name", y="Marks", data=df)
 
# Setting the x-acis label and its size
plt.xlabel("Students", size=15)
 
# Setting the y-axis label and its size
plt.ylabel("Marks Secured", size=15)
 
# Finallt plotting the graph
plt.show()

Producción:

Diagrama de barras sin procesar del marco de datos

  • Agregar las anotaciones. Nuestra estrategia aquí será iterar todas las barras y poner un texto sobre todas ellas que señalará los valores de esa barra en particular. Aquí usaremos la función de Matlpotlib llamada anotar(). Podemos encontrar varios usos de esta función en varios escenarios, actualmente, solo mostraremos el valor de las respectivas barras en su parte superior.

Nuestros pasos serán:

  1. Iterar sobre las barras
  2. Obtenga la posición del eje x (x) y el ancho (w) de la barra, esto nos ayudará a obtener la coordenada x del texto, es decir , get_x()+get_width()/2 .
  3. La coordenada y (y) del texto se puede encontrar usando la altura de la barra, es decir, get_height()
  4. Entonces tenemos las coordenadas del valor de la anotación, es decir, get_x()+get_width()/2, get_height()
  5. Pero esto imprimirá la anotación exactamente en el límite de la barra, por lo que para obtener una gráfica anotada más agradable, usamos el parámetro xyplot=(0, 8) . Aquí 8 denota los píxeles que quedarán desde la parte superior de la barra. Por lo tanto, para ir por debajo de la línea de compás podemos usar xy=(0,-8) .
  6. Así que ejecutamos el siguiente código para obtener el gráfico anotado:

Python3

# Defining the plot size
plt.figure(figsize=(8, 8))
 
# Defining the values for x-axis, y-axis
# and from which dataframe the values are to be picked
plots = sns.barplot(x="Name", y="Marks", data=df)
 
# Iterrating over the bars one-by-one
for bar in plots.patches:
   
  # Using Matplotlib's annotate function and
  # passing the coordinates where the annotation shall be done
  # x-coordinate: bar.get_x() + bar.get_width() / 2
  # y-coordinate: bar.get_height()
  # free space to be left to make graph pleasing: (0, 8)
  # ha and va stand for the horizontal and vertical alignment
    plots.annotate(format(bar.get_height(), '.2f'),
                   (bar.get_x() + bar.get_width() / 2,
                    bar.get_height()), ha='center', va='center',
                   size=15, xytext=(0, 8),
                   textcoords='offset points')
 
# Setting the label for x-axis
plt.xlabel("Students", size=14)
 
# Setting the label for y-axis
plt.ylabel("Marks Secured", size=14)
 
# Setting the title for the graph
plt.title("This is an annotated barplot")
 
# Finally showing the plot
plt.show()

Producción:

Gráfico de barras anotado con los valores de las barras

A continuación se muestra el programa completo basado en el enfoque anterior:

Python3

# Importing libraries for dataframe creation
# and graph plotting
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
 
# Creating our own dataframe
data = {"Name": ["Alex", "Bob", "Clarein", "Dexter"],
        "Marks": [45, 23, 78, 65]}
 
# Now convert this dictionary type data into a pandas dataframe
# specifying what are the column names
df = pd.DataFrame(data, columns=['Name', 'Marks'])
 
 
# Defining the plot size
plt.figure(figsize=(8, 8))
 
# Defining the values for x-axis, y-axis
# and from which dataframe the values are to be picked
plots = sns.barplot(x="Name", y="Marks", data=df)
 
# Iterrating over the bars one-by-one
for bar in plots.patches:
   
  # Using Matplotlib's annotate function and
  # passing the coordinates where the annotation shall be done
  # x-coordinate: bar.get_x() + bar.get_width() / 2
  # y-coordinate: bar.get_height()
  # free space to be left to make graph pleasing: (0, 8)
  # ha and va stand for the horizontal and vertical alignment
  plots.annotate(format(bar.get_height(), '.2f'),
                   (bar.get_x() + bar.get_width() / 2,
                    bar.get_height()), ha='center', va='center',
                   size=15, xytext=(0, 8),
                   textcoords='offset points')
 
# Setting the label for x-axis
plt.xlabel("Students", size=14)
 
# Setting the label for y-axis
plt.ylabel("Marks Secured", size=14)
 
# Setting the title for the graph
plt.title("This is an annotated barplot")
 
# Finally showing the plot
plt.show()

Producción:

Gráfico de barras anotado con los valores de las barras

A continuación se muestran algunos ejemplos que representan las barras de anotación en un diagrama de barras con la biblioteca matplotlib :

Ejemplo 1:

Python3

# Importing libraries for dataframe creation
# and graph plotting
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
 
# Creating our own dataframe
data = {"Language": ["Python", "C++", "Java"],
        "Students": [75, 50, 25]}
 
# Now convert this dictionary type data into a pandas dataframe
# specifying what are the column names
df = pd.DataFrame(data, columns=['Language', 'Students'])
 
 
# Defining the plot size
plt.figure(figsize=(5, 5))
 
# Defining the values for x-axis, y-axis
# and from which dataframe the values are to be picked
plots = sns.barplot(x="Language", y="Students", data=df)
 
# Iterrating over the bars one-by-one
for bar in plots.patches:
   
    # Using Matplotlib's annotate function and
    # passing the coordinates where the annotation shall be done
    plots.annotate(format(bar.get_height(), '.2f'),
                   (bar.get_x() + bar.get_width() / 2,
                    bar.get_height()), ha='center', va='center',
                   size=15, xytext=(0, 5),
                   textcoords='offset points')
 
 
# Setting the title for the graph
plt.title("Example 1")
 
# Finally showing the plot
plt.show()

Producción:

Ejemplo 2:

Python3

# Importing libraries for dataframe creation
# and graph plotting
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
 
# Creating our own dataframe
data = {"Section": ["A", "B", "C", 'D', 'E'],
        "Students": [0, 10, 20, 30, 40]}
 
# Now convert this dictionary type data into a pandas dataframe
# specifying what are the column names
df = pd.DataFrame(data, columns=['Section', 'Students'])
 
 
# Defining the plot size
plt.figure(figsize=(5, 5))
 
# Defining the values for x-axis, y-axis
# and from which dataframe the values are to be picked
plots = sns.barplot(x="Section", y="Students", data=df)
 
# Iterrating over the bars one-by-one
for bar in plots.patches:
 
    # Using Matplotlib's annotate function and
    # passing the coordinates where the annotation shall be done
    plots.annotate(format(bar.get_height(), '.2f'),
                   (bar.get_x() + bar.get_width() / 2,
                    bar.get_height()), ha='center', va='center',
                   size=15, xytext=(0, 5),
                   textcoords='offset points')
 
 
# Setting the title for the graph
plt.title("Example 2")
 
# Finally showing the plot
plt.show()

Python3

# Importing libraries for dataframe creation
# and graph plotting
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
 
# Creating our own dataframe
data = {"Section": ["A", "B", "C", 'D', 'E'],
        "Students": [0, 10, 20, 30, 40]}
 
# Now convert this dictionary type data into a pandas dataframe
# specifying what are the column names
df = pd.DataFrame(data, columns=['Section', 'Students'])
 
 
# Defining the plot size
plt.figure(figsize=(5, 5))
 
# Defining the values for x-axis, y-axis
# and from which dataframe the values are to be picked
plots = sns.barplot(x="Section", y="Students", data=df)
 
# Iterrating over the bars one-by-one
for bar in plots.patches:
 
    # Using Matplotlib's annotate function and
    # passing the coordinates where the annotation shall be done
    plots.annotate(format(bar.get_height(), '.2f'),
                   (bar.get_x() + bar.get_width() / 2,
                    bar.get_height()), ha='center', va='center',
                   size=15, xytext=(0, 5),
                   textcoords='offset points')
 
 
# Setting the title for the graph
plt.title("Example 2")
 
# Finally showing the plot
plt.show()

Producción:

Publicación traducida automáticamente

Artículo escrito por sagarpandey7742 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *