Apa nama plot ini yang memiliki baris dengan dua titik yang terhubung?

19

Saya telah membaca laporan EIA dan plot ini menarik perhatian saya. Saya sekarang ingin dapat membuat jenis plot yang sama.

masukkan deskripsi gambar di sini

Ini menunjukkan evolusi produktivitas energi antara dua tahun (1990-2015) dan menambahkan nilai perubahan antara dua periode ini.

Apa nama plot jenis ini? Bagaimana saya bisa membuat plot yang sama (dengan berbagai negara) di excel?

Otto
sumber
Apakah pdf ini sumbernya? Saya tidak melihat sosok itu di dalamnya.
gung - Pasang kembali Monica
1
Saya biasanya menyebut ini titik plot.
StatsStudent
Nama lain adalah plot lollipop , terutama ketika pengamatan telah memasangkan data yang sedang dilihat.
adin
1
Sepertinya plot halter.
user2974951

Jawaban:

25

Jawaban oleh @gung benar dalam mengidentifikasi jenis bagan dan menyediakan tautan ke cara menerapkan di Excel, seperti yang diminta oleh OP. Tetapi bagi orang lain yang ingin tahu bagaimana melakukan ini di R / tidyverse / ggplot, di bawah ini adalah kode lengkap:

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

Grafik seperti yang diterapkan di ggplot

Ini dapat diperluas untuk menambah label nilai dan untuk menyoroti warna dari satu kasus di mana nilai tukar pesanan, seperti pada aslinya.

Michael MacAskill
sumber
30

Itu plot titik. Kadang-kadang disebut "Cleveland dot plot" karena ada varian histogram yang dibuat dengan titik-titik yang kadang-kadang disebut dot plot juga. Versi khusus ini memplot dua titik per negara (selama dua tahun) dan menarik garis yang lebih tebal di antara mereka. Negara-negara diurutkan berdasarkan nilai yang terakhir. Referensi utama adalah buku Cleveland's Visualisasi Data . Googling menuntun saya ke tutorial Excel ini .


Saya mengorek data, kalau-kalau ada yang ingin bermain dengan mereka.

                       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 - Reinstate Monica
sumber
3
BTW, "gesek" berarti memperkirakan nilai-nilai yang mewakili titik-titik dalam plot. FWIW, saya menggunakan Web Plot Digitizer .
gung - Reinstate Monica
1
Atau. sepele, titik grafik. Prekursor tampak tipis di tanah tetapi memang ada. Lihat misalnya Snedecor, GW 1937. Metode Statistik Diterapkan untuk Eksperimen di Pertanian dan Biologi . Ames, IA: Collegiate Press. Grafik ini dijatuhkan di beberapa titik kemudian dalam revisi teks terkenal ini; itu tidak muncul dalam edisi bersama penulis bersama WG Cochran,
Nick Cox
22

Ada yang menyebutnya plot lollipop (horizontal) dengan dua kelompok.

Berikut adalah cara membuat plot ini menggunakan matplotlibdan menggunakan Python seaborn(hanya digunakan untuk style), diadaptasi dari https://python-graph-gallery.com/184-lollipop-plot-with-2-groups/ dan seperti yang diminta oleh OP dalam komentar.

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

masukkan deskripsi gambar di sini

Graipher
sumber