¿Cuál es el nombre de esta trama que tiene filas con dos puntos conectados?

19

He estado leyendo el informe de EIA y este complot captó mi atención. Ahora quiero poder crear el mismo tipo de trama.

ingrese la descripción de la imagen aquí

Muestra la evolución de la productividad energética entre dos años (1990-2015) y agrega el valor de cambio entre estos dos períodos.

¿Cuál es el nombre de este tipo de trama? ¿Cómo puedo crear la misma trama (con diferentes países) en Excel?

Otón
fuente
¿Es este pdf la fuente? No veo esa figura en ella.
gung - Restablece a Monica
1
Generalmente llamo a esto un diagrama de puntos.
StatsStudent
Otro nombre es gráfico de piruletas , particularmente cuando las observaciones tienen datos emparejados que se están mirando.
Adin
1
Parece una trama con mancuernas.
user2974951

Respuestas:

25

La respuesta de @gung es correcta al identificar el tipo de gráfico y proporcionar un enlace a cómo implementar en Excel, según lo solicitado por el OP. Pero para otros que quieran saber cómo hacer esto en R / tidyverse / ggplot, a continuación se encuentra el código completo:

library(dplyr)   # for data manipulation
library(tidyr)   # for reshaping the data frame
library(stringr) # string manipulation
library(ggplot2) # graphing

# create the data frame 
# (in wide format, as needed for the line segments):
dat_wide = tibble::tribble(
  ~Country,   ~Y1990,   ~Y2015,
  'Russia',  71.5, 101.4,
  'Canada',  74.4, 102.9,
  'Other non-OECD Europe/Eurasia',  60.9, 135.2,
  'South Korea',   127, 136.2,
  'China',  58.5, 137.1,
  'Middle East', 170.9, 158.8,
  'United States', 106.8,   169,
  'Australia/New Zealand', 123.6, 170.9,
  'Brazil', 208.5, 199.8,
  'Japan',   181, 216.7,
  'Africa', 185.4,   222,
  'Other non-OECD Asia', 202.7,   236,
  'OECD Europe', 173.8, 239.9,
  'Other non-OECD Americas', 193.1, 242.3,
  'India', 173.8, 260.6,
  'Mexico/Chile', 221.1, 269.8
)

# a version reshaped to long format (for the points):
dat_long = dat_wide %>% 
  gather(key = 'Year', value = 'Energy_productivity', Y1990:Y2015) %>% 
  mutate(Year = str_replace(Year, 'Y', ''))

# create the graph:
ggplot() +
  geom_segment(data = dat_wide, 
               aes(x    = Y1990, 
                   xend = Y2015, 
                   y    = reorder(Country, Y2015), 
                   yend = reorder(Country, Y2015)),
               size = 3, colour = '#D0D0D0') +
  geom_point(data = dat_long,
             aes(x      = Energy_productivity, 
                 y      = Country, 
                 colour = Year),
             size = 4) +
  labs(title = 'Energy productivity in selected countries \nand regions',
       subtitle = 'Billion dollars GDP per quadrillion BTU',
       caption = 'Source: EIA, 2016',
       x = NULL, y = NULL) +
  scale_colour_manual(values = c('#1082CD', '#042B41')) +
  theme_bw() +
  theme(legend.position = c(0.92, 0.20),
        legend.title = element_blank(),
        legend.box.background = element_rect(colour = 'black'),
        panel.border = element_blank(),
        axis.ticks = element_line(colour = '#E6E6E6'))

ggsave('energy.png', width = 20, height = 10, units = 'cm')

Gráfico implementado en ggplot

Esto podría extenderse para agregar etiquetas de valor y resaltar el color del caso en que los valores cambian de orden, como en el original.

Michael MacAskill
fuente
30

Eso es un diagrama de puntos. A veces se le llama "diagrama de puntos de Cleveland" porque hay una variante de un histograma hecho con puntos que las personas a veces también llaman diagrama de puntos. Esta versión particular traza dos puntos por país (durante los dos años) y dibuja una línea más gruesa entre ellos. Los países están ordenados por este último valor. La referencia principal sería el libro de Cleveland Visualizing Data . Buscar en Google me lleva a este tutorial de Excel .


Raspé los datos, en caso de que alguien quiera jugar con ellos.

                       Country  1990  2015
                        Russia  71.5 101.4
                        Canada  74.4 102.9
 Other non-OECD Europe/Eurasia  60.9 135.2
                   South Korea 127.0 136.2
                         China  58.5 137.1
                   Middle East 170.9 158.8
                 United States 106.8 169.0
         Australia/New Zealand 123.6 170.9
                        Brazil 208.5 199.8
                         Japan 181.0 216.7
                        Africa 185.4 222.0
           Other non-OECD Asia 202.7 236.0
                   OECD Europe 173.8 239.9
       Other non-OECD Americas 193.1 242.3
                         India 173.8 260.6
                  Mexico/Chile 221.1 269.8
gung - Restablece a Monica
fuente
3
Por cierto, "raspar" significa estimar los valores que representan los puntos en la gráfica. FWIW, usé Web Plot Digitizer .
gung - Restablece a Monica
1
O. trivialmente, gráfico de puntos. Los precursores parecen delgados en el suelo pero existen. Véase, por ejemplo, Snedecor, GW 1937. Métodos estadísticos aplicados a los experimentos en agricultura y biología . Ames, IA: Collegiate Press. Este gráfico se eliminó en algún momento posterior de la revisión de este conocido texto; no aparece en ediciones con el coautor WG Cochran,
Nick Cox
22

Algunos lo llaman una trama de paleta (horizontal) con dos grupos.

Aquí es cómo hacer esta trama en Python usando matplotliby seaborn(solo usado para el estilo), adaptado de https://python-graph-gallery.com/184-lollipop-plot-with-2-groups/ y según lo solicitado por el OP en los comentarios.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="whitegrid")  # set style

df = ...
df = df.set_index("Country").sort_values("2015")
df["change"] = df.apply(lambda df2: "{:+.0%}".format(df2["2015"] / df2["1990"] - 1), axis=1)
print(df)

#                                 1990   2015 change
# Country                                           
# Russia                          71.5  101.4   +42%
# Canada                          74.4  102.9   +38%
# Other non-OECD Europe/Eurasia   60.9  135.2  +122%
# South Korea                    127.0  136.2    +7%
# China                           58.5  137.1  +134%
# Middle East                    170.9  158.8    -7%
# United States                  106.8  169.0   +58%
# Australia/New Zealand          123.6  170.9   +38%
# Brazil                         208.5  199.8    -4%
# Japan                          181.0  216.7   +20%
# Africa                         185.4  222.0   +20%
# Other non-OECD Asia            202.7  236.0   +16%
# OECD Europe                    173.8  239.9   +38%
# Other non-OECD Americas        193.1  242.3   +25%
# India                          173.8  260.6   +50%
# Mexico/Chile                   221.1  269.8   +22%

plt.figure(figsize=(12,6))
y_range = range(1, len(df.index) + 1)
plt.hlines(y=y_range, xmin=df['1990'], xmax=df['2015'], color='grey', alpha=0.4, lw=3)
plt.scatter(df['1990'], y_range, color='blue', s=100, label='1990')
plt.scatter(df['2015'], y_range, color='black', s=100 , label='2015')
for (_, row), y in zip(df.iterrows(), y_range):
    plt.annotate(row["change"], (max(row["1990"], row["2015"]) + 2, y))
plt.legend(loc=2)

plt.yticks(y_range, df.index)
plt.title("Energy productivity in selected countries and regions, 1990 and 2015\nBillion dollars GDP per quadrillion BTU", loc='left')
plt.xlim(50, 300)
plt.gcf().subplots_adjust(left=0.35)
plt.tight_layout()
plt.show()

ingrese la descripción de la imagen aquí

Graipher
fuente