Wie heißt dieses Diagramm, das Zeilen mit zwei verbundenen Punkten enthält?


19

Ich habe den UVP-Bericht gelesen und diese Handlung hat meine Aufmerksamkeit erregt. Ich möchte jetzt in der Lage sein, die gleiche Art von Handlung zu erstellen.

Bildbeschreibung hier eingeben

Es zeigt die Entwicklung der Energieproduktivität zwischen zwei Jahren (1990-2015) und addiert den Änderungswert zwischen diesen beiden Zeiträumen.

Wie heißt diese Art von Grundstück? Wie kann ich dasselbe Grundstück (mit verschiedenen Ländern) in Excel erstellen?


Ist dieses PDF die Quelle? Ich sehe diese Figur nicht darin.
gung - Wiedereinsetzung von Monica

1
Ich bezeichne dies normalerweise als Punktdiagramm.
StatsStudent

Ein anderer Name ist Lollipop-Plot , insbesondere wenn die Beobachtungen gepaarte Daten haben, die betrachtet werden.
Adin

1
Sieht aus wie eine Kurzhantelhandlung.
User2974951

Antworten:


25

Die Antwort von @gung ist korrekt, wenn Sie den Diagrammtyp identifizieren und einen Link zur Implementierung in Excel bereitstellen, wie vom OP angefordert. Aber für andere, die wissen wollen, wie dies in R / tidyverse / ggplot gemacht wird, ist der folgende Code vollständig:

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 wie in ggplot implementiert

Dies könnte erweitert werden, um Wertelabels hinzuzufügen und die Farbe des einen Falls hervorzuheben, in dem die Werte wie im Original die Reihenfolge wechseln.


30

Das ist ein Punktdiagramm. Es wird manchmal als "Cleveland-Punktdiagramm" bezeichnet, da es eine Variante eines Histogramms gibt, das mit Punkten erstellt wurde, die manchmal auch als Punktdiagramm bezeichnet werden. Diese besondere Version zeichnet zwei Punkte pro Land (für die zwei Jahre) und zeichnet eine dickere Linie zwischen ihnen. Die Länder werden nach dem letztgenannten Wert sortiert. Die Hauptreferenz wäre Clevelands Buch Visualizing Data . Googeln führt mich zu diesem Excel-Tutorial .


Ich habe die Daten abgekratzt, falls jemand damit spielen möchte.

                       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
Übrigens bedeutet "Kratzen" das Schätzen der Werte, die die Punkte in der Darstellung darstellen. FWIW, ich habe den Web Plot Digitizer benutzt .
gung - Wiedereinsetzung von Monica

1
Oder. trivial Punktdiagramm. Vorläufer scheinen dünn zu sein, existieren aber. Siehe z. B. Snedecor, GW 1937. Statistische Methoden für Experimente in Landwirtschaft und Biologie . Ames, IA: Collegiate Press. Dieses Diagramm wurde zu einem späteren Zeitpunkt in der Überarbeitung dieses bekannten Textes gelöscht. es erscheint nicht in Ausgaben mit Co-Autor WG Cochran,
Nick Cox

22

Einige nennen es ein (horizontales) Lollipop-Grundstück mit zwei Gruppen.

Hier ist , wie diese Handlung in Python machen mit matplotlibund seaborn(nur für den Stil verwendet), angepasst von https://python-graph-gallery.com/184-lollipop-plot-with-2-groups/ und wie durch die angeforderte OP in den Kommentaren.

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

Bildbeschreibung hier eingeben

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.