python построит две временные точки с наклоном

#python #matplotlib #seaborn

Вопрос:

Я хочу построить несколько диаграмм в виде сетки фасетов, каждая из которых включает в себя две точки. Кроме того, я хочу рассчитать и отобразить наклон линии:

 ID     TimePoint1    TimePoint2
================================
A      500           20000
B      200           1000
C      3000          50000
 

Что-то вроде этого:
введите описание изображения здесь

Я попробовал этот пример кода, но на графиках ничего не отображается:

 import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_table("test.csv", sep=",")
g = sns.FacetGrid(data, col="ID", col_wrap=4, height=2, ylim=(0, 10))
g.map(sns.pointplot, "TimePoint1", "TimePoint2", color=".3", ci=None)
 

Как я могу добиться этого с помощью seaborn?

Ответ №1:

Здесь вы использовали точку времени 1 как x, а точку времени 2 как y. Чтобы достичь того, чего вы хотите, вам сначала нужно изменить форму ваших данных. Предполагая data входные данные:

 import pandas as pd
import matplotlib.pyplot as plt
data_long = (data.rename(columns=lambda x: int(x[-1]) if x.startswith('TimePoint') else x)
                 .melt(id_vars=['ID'], var_name='TimePoint')
             )
g = sns.FacetGrid(data_long, col="ID", col_wrap=4, height=2,) # ylim=(0, 10))
g.map(sns.pointplot, "TimePoint", "value", color=".3", ci=None)
 

выход:

точечная карта сиборна

nb. Я удалил ваш ylim, который был недействителен

data_long:

   ID TimePoint  value
0  A         1    500
1  B         1    200
2  C         1   3000
3  A         2  20000
4  B         2   1000
5  C         2  50000
 

Вы также можете удобно использовать catplot эту обертку вокруг FacetGrid:

 sns.catplot(data=df_long, x='TimePoint', y='value', col='ID',
            col_wrap=4, height=2, color=".3", ci=None, kind='point'
           )
 

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

1. примечание: OP может упростить FacetGrid map использование catplot обертки: sns.catplot(x="TimePoint", y="value", col="ID", col_wrap=4, height=2, color=".3", ci=None, kind="point", data=data_long)

2. @tdy Да, верно, я только что использовал исходный код, но это очень хороший момент. Я обновил ответ.

3. @mozway Я вижу, не понял, что мне нужно переформатировать данные. Спасибо!