Qual é o nome desse gráfico que possui linhas com dois pontos conectados?

19

Eu tenho lido o relatório da AIA e essa trama chamou minha atenção. Agora eu quero ser capaz de criar o mesmo tipo de plotagem.

insira a descrição da imagem aqui

Ele mostra a evolução da produtividade energética entre dois anos (1990-2015) e agrega o valor da mudança entre esses dois períodos.

Qual é o nome desse tipo de plotagem? Como posso criar o mesmo gráfico (com diferentes países) no Excel?

Otto
fonte
É este pdf a fonte? Não vejo essa figura nela.
gung - Restabelece Monica
1
Eu costumo chamar isso de um gráfico de pontos.
StatsStudent 26/08
Outro nome é enredo de pirulito , principalmente quando as observações têm dados emparelhados sendo analisados.
adin 26/08
1
Parece uma trama de halteres.
user2974951 27/08

Respostas:

25

A resposta de @gung está correta na identificação do tipo de gráfico e no fornecimento de um link para a implementação no Excel, conforme solicitado pelo OP. Mas para outros que desejam saber como fazer isso no R / tidyverse / ggplot, abaixo está o 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 conforme implementado no ggplot

Isso pode ser estendido para adicionar rótulos de valor e destacar a cor do caso em que os valores trocam de ordem, como no original.

Michael MacAskill
fonte
30

Isso é um gráfico de pontos. Às vezes, é chamado de "plotagem de pontos de Cleveland" porque existe uma variante de um histograma feito com pontos que as pessoas às vezes chamam de plotagem de pontos. Esta versão em particular representa dois pontos por país (durante os dois anos) e desenha uma linha mais grossa entre eles. Os países são classificados pelo último valor. A referência principal seria o livro de Cleveland Visualizing Data . A pesquisa no Google me leva a este tutorial do Excel .


Raspei os dados, caso alguém queira brincar com eles.

                       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
- Reinstate Monica
fonte
3
BTW, "raspar" significa estimar os valores que os pontos no gráfico representam. FWIW, usei o Web Plot Digitizer .
gung - Reinstate Monica
1
Ou. trivialmente, gráfico de pontos. Os precursores parecem finos no chão, mas existem. Veja, por exemplo, Snedecor, GW 1937. Métodos Estatísticos Aplicados a Experiências em Agricultura e Biologia . Ames, IA: Collegiate Press. Este gráfico foi descartado em algum momento posterior na revisão deste texto bem conhecido; não aparece em edições com o co-autor WG Cochran,
Nick Cox
22

Alguns chamam de um enredo de pirulito (horizontal) com dois grupos.

Aqui está como fazer esse gráfico em Python usando matplotlibe seaborn(usado apenas para o estilo), adaptado de https://python-graph-gallery.com/184-lollipop-plot-with-2-groups/ e conforme solicitado pelo OP nos comentários.

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

insira a descrição da imagem aqui

Graipher
fonte