#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 только для того, чтобы избежать перекрытия точек. Смотрите Документацию обоих графиков в приведенных выше ссылках, чтобы получить более подробную информацию