Qual è il nome di questo diagramma che ha righe con due punti collegati?


19

Ho letto il rapporto EIA e questa trama ha catturato la mia attenzione. Ora voglio essere in grado di creare lo stesso tipo di trama.

inserisci qui la descrizione dell'immagine

Mostra l'evoluzione della produttività energetica tra due anni (1990-2015) e aggiunge il valore di cambiamento tra questi due periodi.

Qual è il nome di questo tipo di trama? Come posso creare la stessa trama (con paesi diversi) in Excel?


È questo pdf la fonte? Non ci vedo quella figura.
gung - Ripristina Monica

1
Di solito lo chiamo punto trama.
StatStudent,

Un altro nome è trama lecca-lecca , in particolare quando le osservazioni hanno dato un'occhiata a dati accoppiati.
Adin,

1
Sembra una trama di manubri.
user2974951

Risposte:


25

La risposta di @gung è corretta nell'identificare il tipo di grafico e nel fornire un collegamento su come implementare in Excel, come richiesto dall'OP. Ma per gli altri che vogliono sapere come farlo in R / tidyverse / ggplot, di seguito è riportato il codice 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')

Grafico implementato in ggplot

Questo potrebbe essere esteso per aggiungere etichette di valore e per evidenziare il colore di un caso in cui i valori cambiano l'ordine, come nell'originale.


30

Questa è una trama a punti. A volte viene chiamato "diagramma a punti Cleveland" perché esiste una variante di un istogramma fatto con punti che le persone a volte chiamano anche un diagramma a punti. Questa particolare versione traccia due punti per paese (per i due anni) e traccia una linea più spessa tra loro. I paesi sono ordinati in base a quest'ultimo valore. Il riferimento principale sarebbe il libro di Cleveland Visualizing Data . Googling mi porta a questo tutorial di Excel .


Ho cancellato i dati, nel caso qualcuno volesse giocarci.

                       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

3
A proposito, "raschiare" significa stimare i valori rappresentati dai punti nel grafico. FWIW, ho usato il digitalizzatore di grafici Web .
gung - Ripristina Monica

1
O. banalmente, diagramma a punti. I precursori sembrano sottili sul terreno ma esistono. Vedi ad esempio Snedecor, GW 1937. Metodi statistici applicati agli esperimenti in agricoltura e biologia . Ames, IA: Collegiate Press. Questo grafico è stato abbandonato in un secondo momento nella revisione di questo noto testo; non appare nelle edizioni con il coautore WG Cochran,
Nick Cox il

22

Alcuni lo chiamano una trama (orizzontale) di lecca-lecca con due gruppi.

Ecco come realizzare questa trama in Python usando matplotlibe seaborn(usato solo per lo stile), adattato da https://python-graph-gallery.com/184-lollipop-plot-with-2-groups/ e come richiesto dal OP nei commenti.

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()

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.