Как сделать участки с небольшими пробелами в Matplotlib или Seaborn? - PullRequest
0 голосов
/ 15 марта 2020

Я хотел бы сделать этот тип графика с несколькими столбцами, разделенными небольшим пробелом, каждый из которых имеет свою категорию, имеющую 3-5 (5 в этом примере) различных наблюдений с различными значениями на оси y:

Plot

Ответы [ 2 ]

3 голосов
/ 15 марта 2020

На самом деле, я могу построить этот график, используя ggplot2. например:

head(mtcars)
# mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
# Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
# Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
# Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
# Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

library(dplyr)
library(ggplot2)
mtcars %>% reshape2::melt() %>% 
  ggplot(aes(x = variable, y = value)) + 
  geom_point() + facet_grid(~ variable) +
  theme(axis.text.x = element_blank())
Вы устанавливаете категориальную переменную в своем наборе данных, а затем используете функцию facet_grid(~). Эта функция может изменить ваш график на несколько графиков с помощью вашей категориальной переменной

enter image description here

1 голос
/ 15 марта 2020

Вот подход для рисования подобного графика с использованием matplotlib Python. Участок имеет серый фон и белые основные и второстепенные линии сетки для разграничения зон. Получить точки в центре каждой маленькой ячейки довольно сложно: разделите на n + 1 пробелы и сдвиньте половину ячейки (1 / 2n). Вторичная ось X может использоваться для установки меток. zorder должен быть установлен так, чтобы точки располагались поверх линий сетки.

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import ticker

n = 5
cols = 7
values = [np.random.uniform(1, 10, n) for c in range(cols)]

fig, ax = plt.subplots()
ax.set_facecolor('lightgrey')
ax.xaxis.set_major_locator(ticker.MultipleLocator(1))
ax.xaxis.set_minor_locator(ticker.MultipleLocator(1 / (n)))
ax.yaxis.set_major_locator(ticker.MultipleLocator(1))
ax.grid(True, which='both', axis='both', color='white')
ax.set_xticklabels([])
ax.tick_params(axis='x', which='both', length=0)
ax.grid(which='major', axis='both', lw=3)
ax.set_xlim(1, cols + 1)
for i in range(1, cols + 1):
    ax.scatter(np.linspace(i, i + 1, n, endpoint=False) + 1 / (2 * n), values[i-1], c='crimson', zorder=2)

ax2 = ax.twiny()
ax2.set_xlim(0.5, cols + 0.5)
ticks = range(1, cols + 1)
ax2.set_xticks(ticks)
ax2.set_xticklabels([f'Cat_{t:02d}' for t in ticks])
bbox = dict(boxstyle="round", ec="limegreen", fc="limegreen", alpha=0.5)
plt.setp(ax2.get_xticklabels(), bbox=bbox)
ax2.tick_params(axis='x', length=0)

plt.show()

resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...