Как называется этот график, в котором есть строки с двумя связанными точками?


19

Я читал отчет об ОВОС, и этот сюжет привлек мое внимание. Теперь я хочу иметь возможность создавать сюжеты того же типа.

введите описание изображения здесь

Он показывает эволюцию энергоэффективности между двумя годами (1990-2015) и добавляет значение изменения между этими двумя периодами.

Как называется этот тип сюжета? Как я могу создать один и тот же сюжет (с разными странами) в Excel?


Это pdf источник? Я не вижу эту фигуру в этом.
gung - Восстановить Монику

1
Я обычно называю это точечным сюжетом.
StatsStudent

Другое название - заговор леденца на палочке , особенно когда наблюдения имеют парные данные, на которые смотрят.
Адина

1
Похоже на сюжет гантели.
user2974951

Ответы:


25

Ответ @gung правильный при определении типа диаграммы и предоставлении ссылки на то, как ее реализовать в Excel, в соответствии с запросом ОП. Но для тех, кто хочет знать, как это сделать в R / tidyverse / ggplot, ниже приведен полный код:

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

График, реализованный в ggplot

Это может быть расширено для добавления меток значений и выделения цвета одного случая, когда значения меняются порядком, как в оригинале.


30

Это точечный сюжет. Его иногда называют «точечным графиком Кливленда», потому что существует вариант гистограммы, составленной из точек, который люди иногда также называют точечным графиком. Эта конкретная версия отображает две точки на страну (за два года) и проводит более толстую линию между ними. Страны отсортированы по последнему значению. Первичной ссылкой будет книга Кливленда « Визуализация данных» . Поиск в Google приводит меня к этому учебнику по Excel .


Я очистил данные, на случай, если кто-нибудь захочет поиграть с ними.

                       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
Кстати, «очистка» означает оценку значений, которые представляют точки на графике. FWIW, я использовал Digitizer Web Plot .
gung - Восстановить Монику

1
Или. тривиально, точечная диаграмма. Предшественники кажутся тонкими на земле, но существуют. См., Например, Snedecor, GW 1937. Статистические методы, применяемые к экспериментам в сельском хозяйстве и биологии . Эймс, ИА: Университетская пресса. Этот график был опущен на более позднем этапе пересмотра этого известного текста; это не появляется в выпусках с соавтором WG Cochran,
Ник Кокс

22

Некоторые называют это (горизонтальный) заговор леденцов с двумя группами.

Вот как сделать этот график в Python, используя matplotlibи seaborn(используется только для стиля), адаптированный из https://python-graph-gallery.com/184-lollipop-plot-with-2-groups/ и по запросу ОП в комментариях.

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

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.