Точечный график / Ggplot с фреймом данных Pandas; имена столбцов как значения x и соответствующие значения столбцов как значения y

#python #pandas #matplotlib #plot #seaborn

#python #pandas #matplotlib #график #seaborn

Вопрос:

Я пытаюсь создать dot-plot / ggplot в Python для фрейма данных, который выглядит следующим образом:

 layers_time = {'2 layers': [20.6885, 25.1765, 18.7503, 19.2090, 19.2548],
               '3 layers': [20.4360, 27.5285, 20.1958, 18.9536, 20.1673],
               '4 layers': [18.1703, 21.9665, 17.0667, 17.3353, 16.2638],
               '5 layers': [19.3265, 25.7931, 17.9827, 18.5448, 18.8970],
               '6 layers': [19.7180, 24.7097, 20.7460, 19.7300, 18.2760]
                }

layers_time = pd.DataFrame(layers_time, columns=['2 layers', '3 layers', 
                           '4 layers', '5 layers', '6 layers'])
  

Все, что я хочу, это чтобы имена столбцов были значениями x, а их соответствующие значения — точками на оси y.
Кроме того, есть ли разумный способ включить среднее значение этих значений в виде точки с другим цветом?
Я пробовал ответы на похожие вопросы, но они не работают, поскольку у меня разные размеры x и y?

Ответ №1:

Давайте попробуем melt фрейм данных, а затем построим разброс с variable помощью as x и values as y

 df=layers_time.melt()#.
plt.scatter(df.variable,df.value)
  

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

Ответ №2:

Ответ

Вы можете оценить средние значения для каждого столбца с df.mean(axis = 0) помощью .
Что касается точечного графика, вы можете сделать это с seaborn.stripplot() помощью (или seaborn.swarmplot() ), но перед этим вам нужно изменить свой pandas.melt() фрейм данных.

Код

 # import
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# data
layers_time = {'2 layers': [20.6885, 25.1765, 18.7503, 19.2090, 19.2548],
               '3 layers': [20.4360, 27.5285, 20.1958, 18.9536, 20.1673],
               '4 layers': [18.1703, 21.9665, 17.0667, 17.3353, 16.2638],
               '5 layers': [19.3265, 25.7931, 17.9827, 18.5448, 18.8970],
               '6 layers': [19.7180, 24.7097, 20.7460, 19.7300, 18.2760]
                }
cols = ['2 layers', '3 layers', '4 layers', '5 layers', '6 layers']
df = pd.DataFrame(layers_time, columns = cols)

# columns means evaluation
means = df.mean(axis = 0).to_list()

# dataframe reshaping
df = pd.melt(frame = df,
             var_name = 'n layers',
             value_name = 'value')

# figure set-up
fig, ax = plt.subplots()

# mean plot
ax.plot(cols, means, color = 'black', marker = 'o', linestyle = '')

# dot-plot
sns.stripplot(ax = ax,
              data = df,
              x = 'n layers',
              y = 'value')

# show figure
plt.show()
  

Вывод

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

stripplot / swarmplot сравнение

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

Выбор между stripplot или swarmplot зависит от объема ваших данных: swarmplot предотвращает перекрытие точек, поэтому это предпочтительнее, когда у вас нет чрезмерного количества точек, и позволяет оценить распределение ваших данных. Напротив, stripplot позволяет перекрывать точки, поэтому вы теряете информацию о распределении данных, но вы можете нанести большее количество точек.

Комментарии:

1. stripplot добавьте равномерный интервал вдоль x, чтобы равномерно заполнить пространство. Напротив, swarmplot имеет тенденцию сохранять точки в центре x для каждого столбца и добавляет интервал x только для того, чтобы избежать перекрытия точек. Смотрите Документацию обоих графиков в приведенных выше ссылках, чтобы получить более подробную информацию