Есть ли функция python (предпочтительно, морской), которая может помочь мне соединить два набора точек линией на диаграмме рассеяния? - PullRequest
1 голос
/ 11 мая 2019
Index   X1  Y1  X2  Y2

0       3   2    7   8

1      -5   5    4  -6

…       …   …   …   …

n       6  -3   5   -1

Есть ли способ создать диаграмму рассеяния с линией, соединяющей (x1, y1) с (x2, y2) для каждой строки в индексе?(т. е. (3,2) необходимо подключиться к (7,8), (-5, 5) необходимо подключиться к (4,-6) и т. д. для каждой строки. Набор данных, который я использую, содержит сотни строк, и мне нужно соединить каждую пару точек линией.

Моя предпочтительная библиотека будет в Seaborn.

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

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

Я видел, что вы спрашивали предпочтительно seaborn, но при необходимости это также может быть сделано в несколько строк кода только с matplotlib и его LineCollection:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib.collections import LineCollection

# DataFrame provided in example:
df = pd.DataFrame(
    {'X1': [3, -5, 6], 'Y1': [2, 5, -3], 'X2': [7, 4, 5], 'Y2': [8, -6, -1]})

fig, ax = plt.subplots()

# Plot the (x1, y1) and (x2, y2) points in different colors
ax.scatter(df['X1'], df['Y1'], color='navy', s=100, lw=0, zorder=5)
ax.scatter(df['X2'], df['Y2'], color='darkorange', s=100, lw=0, zorder=6)

# Create the segments coordinates :
segments = df.T.apply(lambda x: [(x.loc['X1'], x['Y1']), (x['X2'], x['Y2'])])
# Use them in a LineCollection
lc = LineCollection(segments, zorder=4, cmap=plt.cm.Blues)
# Set different linewidth if necessary :
lc.set_linewidths(np.random.random_sample(size=len(segments)) * 2)
ax.add_collection(lc)

result

0 голосов
/ 11 мая 2019

Вы можете использовать двойной расплав в сочетании с sns.lineplot:

import pandas as pd
import seaborn as sns

# generate identification column
df['id'] = df.index

# combine all X values in a column. Same for Y values
df_x = df.melt(id_vars='id', value_vars=['X1', 'X2']).rename(columns={'value':'X'})[['id', 'X']]
df_y = df.melt(id_vars='id', value_vars=['Y1', 'Y2']).rename(columns={'value':'Y'})[['Y']]

# combine X-values, Y-values, and identification column
temp = pd.concat([df_x, df_y], axis=1)

# use lineplot, with different lines for each id:
sns.lineplot(x='X', y='Y', hue='id', data=temp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...