簡體   English   中英

線圖和 relplot 在 seaborn 中的同一圖中

[英]Lineplot and relplot in the same figure in seaborn

我想在 seaborn 的同一個圖中繪制兩個數據集,但是,它不起作用。

我的代碼:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

x = np.arange(1, 36)
x2 =[5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 20, 20,
20, 20, 20, 30, 30, 30, 30, 30]

y = [6431, 6449, 6466, 6483, 6499, 6515, 6530, 6545, 6559, 6572, 6586,
6599, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605,
6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605]

y2 = [6437, 6513, 6499, 6540, 6499, 6472, 6635, 6534, 6532, 6579, 6575,
      6575, 6509, 6660, 6540, 6693, 6520, 6691, 6580, 6627]

df1 = {'x': x, 'y': y}
df2 = {'x': x2, 'y': y2}

df1 = pd.DataFrame(df1)
df2 = pd.DataFrame(df2)

fig, ax = plt.subplots(figsize=(10, 6.68))

sns.set(style="ticks", font='arial', font_scale=2)

sns.lineplot(x="x", y="y", 
            palette = 'PuBuGn_d', ax=ax, data=df1)
sns.relplot(x="x", y="y",
        palette = 'cmap', ax = ax, data=df2)

plt.show()

它應該看起來像:
在此處輸入圖片說明

是否可以使用千位分隔符格式化 y 軸?

sns.relplot圖形級函數 這意味着它可以為不同的列組合創建許多子圖。 因此,它總是創建自己的圖形,即使只需要 1 個子圖也是如此。 用底層scatterplot替換relplot解決了這個問題。

要獲得千位分隔符,您可以將FuncFormatter與函數一起使用,該函數將數字轉換為格式komma的字符串。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
import pandas as pd

sns.set_style("whitegrid")
x = np.arange(1, 36)
x2 = [5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 30, 30, 30, 30, 30]
y = [6431, 6449, 6466, 6483, 6499, 6515, 6530, 6545, 6559, 6572, 6586, 6599, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605]
y2 = [6437, 6513, 6499, 6540, 6499, 6472, 6635, 6534, 6532, 6579, 6575, 6575, 6509, 6660, 6540, 6693, 6520, 6691, 6580, 6627]

df1 = {'x': x, 'y': y}
df2 = {'x': x2, 'y': y2}

df1 = pd.DataFrame(df1)
df2 = pd.DataFrame(df2)

fig, ax = plt.subplots(figsize=(10, 6.68))

sns.set(style="ticks", font='arial', font_scale=2)

sns.lineplot(x="x", y="y",
             palette='PuBuGn_d', ax=ax, data=df1)
sns.scatterplot(x="x", y="y",
                color='orange', ax=ax, data=df2, s=150)
ax.yaxis.set_major_formatter(FuncFormatter(lambda x, p: f'{x:,.0f}'))

plt.tight_layout()
plt.show()

示例圖

這是一個潛在的解決方法。 切換sns.relplotsns.lineplot的位置給出所需的輸出:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

x = np.arange(1, 36)
x2 =[5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 20, 20,
20, 20, 20, 30, 30, 30, 30, 30]

y = [6431, 6449, 6466, 6483, 6499, 6515, 6530, 6545, 6559, 6572, 6586,
6599, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605,
6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605, 6605]

y2 = [6437, 6513, 6499, 6540, 6499, 6472, 6635, 6534, 6532, 6579, 6575,
      6575, 6509, 6660, 6540, 6693, 6520, 6691, 6580, 6627]

df1 = {'x': x, 'y': y}
df2 = {'x': x2, 'y': y2}

df1 = pd.DataFrame(df1)
df2 = pd.DataFrame(df2)

sns.set(style="ticks", font='arial', font_scale=1)

sns.relplot(x="x", y="y", color='orange', data=df2)
sns.lineplot(x="x", y="y", data=df1)

plt.show()

輸出 :

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM