标签: seaborn

根据图中未包含的值设置 Seaborn 条形颜色

我有一个 pandas 数据框df,其中包含列x(分类)、yz(均为浮点数)。

这是我的条形图。

sns.barplot(data=df, x=x, y=y)
Run Code Online (Sandbox Code Playgroud)

如何根据列的值设置条形的调色板z?我想设置一个 Matplotlib 样式调色板,例如magmaRdYlBu。基本上,就像设置hue参数一样,但是使用标量变量。

提前致谢!

python matplotlib seaborn

1
推荐指数
1
解决办法
9029
查看次数

Seaborn 条形图和 X 轴上的日期格式

我目前正在使用 Seaborn 和 Pandas 来可视化数据集。我有一些与时间相关的数据,我想用条形图绘制它们。

然而,我在 Seaborn 中遇到了两个问题:

  1. 设置 x 轴上日期的格式
  2. 仅显示少数日期(因为在 6 个月图表上标记每一天是没有意义的)

我在正常的 Matplotlib 中找到了解决问题的方法,即:

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

N = 20
np.random.seed(2022)
dates = pd.date_range('1/1/2014', periods=N, freq='m')
df = pd.DataFrame(
    data={'dt':dates, 'val': np.random.randn(N)}
)

fig, ax = plt.subplots(figsize=(10, 6))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
ax.bar(df['dt'], df['val'], width=25, align='center')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然而,我已经在 Seaborn 中完成了大部分图表,并且我希望保持一致。一旦我将之前的代码转换为 Seaborn,我就失去了格式化日期的能力:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import …
Run Code Online (Sandbox Code Playgroud)

python datetime matplotlib pandas seaborn

1
推荐指数
1
解决办法
3661
查看次数

Seaborn 中的次要情节

如何创建一个包含 2 个 seaborn 地块(子图)的地块

\n\n

如何将 2 个seaborn 地块合并为 1 个?

\n\n
plt.figure(figsize = (12, 6))\nax = sns.scatterplot(x = model1.fittedvalues, y = model1.resid)\nplt.grid()\nax.axhline(y=0, color=\'r\', linewidth=4) \nax.set_xlabel("vysv\xc4\x9btlovan\xc3\xa1 prom\xc4\x9bnn\xc3\xa1");\nax.set_ylabel("residua");\n\n\nplt.figure(figsize = (12, 6))\nax = sns.distplot(a = model1.resid, bins = 40, norm_hist=True,)\nplt.grid()\nax.set_title("Histogram rezidu\xc3\xad", fontsize = 25);\n\n
Run Code Online (Sandbox Code Playgroud)\n

python seaborn

1
推荐指数
1
解决办法
9444
查看次数

Seaborn 热图按行颜色

我有一个网络图。

网络

每个节点都是一个案例,每条边都是一个 CPT。

我曾经community.best_partition将图表分成四个社区(用颜色标记)。

为了更好地可视化我使用的每个社区中共享的 CPT 和案例量plt.subplots,并sns.heatmap创建了四个社区之间具有相似匹配颜色的热图。

热图

生成热图的代码:

fig, axs = plt.subplots(nrows=4, figsize=(16,8), sharex=True)

cmaps = ['Blues', 'Oranges', 'Greens', 'Reds']

comms = range(4)

for ax, cmap, comm in zip(axs, cmaps, comms):
    sns.heatmap(
        data=_.loc[[comm]],
        ax=ax,
        cmap=cmap,
        annot=True,
        annot_kws={
            'fontsize' : 12
        },
        fmt='g',
        cbar=False,
        robust=True,
    )

    ax.set_ylabel('Community')

    ax.set_xlabel('');
Run Code Online (Sandbox Code Playgroud)

问题

有没有办法按sns.heatmap行(在本例中为社区)指定颜色,而无需创建 4 个单独的热图?

这是一些示例数据:

cpt   52320  52353  52310  49568  50432  52234  52317  50435  52354  52332
comm                                                                      
0       NaN    3.0    NaN    1.0    1.0    NaN    2.0 …
Run Code Online (Sandbox Code Playgroud)

python matplotlib heatmap seaborn

1
推荐指数
1
解决办法
1821
查看次数

分别调整seaborn.heatmap的垂直和水平线宽

该参数linewidth调整每个单元之间的空间大小。例如:

import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np; np.random.seed(0)
uniform_data = np.random.rand(2000, 6)
ax = sns.heatmap(uniform_data)
Run Code Online (Sandbox Code Playgroud)

正常热图

plt.clf()
ax = sns.heatmap(uniform_data, linewidth=0.0001)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您只能看到白色,因为我的热图形状明显倾斜:2000 行和 6 列。我想在每个单元格列之间有一个垂直的空白。因此,我需要想办法单独调整垂直线宽。如何才能做到这一点?

python matplotlib heatmap seaborn

1
推荐指数
1
解决办法
2314
查看次数

为多个seaborn图创建单个图例

我正在使用“iris.csv”数据制作箱线图。我试图通过测量(即花瓣长度、花瓣宽度、萼片长度、萼片宽度)将数据分解为多个数据框,然后在 forloop 上绘制箱线图,从而添加子图。

最后,我想立即为所有箱线图添加一个通用图例。但是,我做不到。我已经使用几个 stackoverflow 问题尝试了几个教程和方法,但我无法修复它。

这是我的代码:

import seaborn as sns 
from matplotlib import pyplot

iris_data = "iris.csv"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset = read_csv(iris_data, names=names)


# Reindex the dataset by species so it can be pivoted for each species 
reindexed_dataset = dataset.set_index(dataset.groupby('class').cumcount())
cols_to_pivot = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width']

# empty dataframe 
reshaped_dataset = pd.DataFrame()
for var_name in cols_to_pivot:
    pivoted_dataset = reindexed_dataset.pivot(columns='class', values=var_name).rename_axis(None,axis=1)
    pivoted_dataset['measurement'] = var_name
    reshaped_dataset = reshaped_dataset.append(pivoted_dataset, ignore_index=True)


## Now, lets spit the dataframe into …
Run Code Online (Sandbox Code Playgroud)

python matplotlib boxplot pandas seaborn

1
推荐指数
1
解决办法
8216
查看次数

Seaborn lineplot :注释最后一个值

我想使用 subplots 绘制 2 个数字。我有一个数据框(simple_line_final_df)

    Madagascar Covid-19 Totaly olona
Daty        
2020-05-20  Marary  371
2020-05-20  Sitrana 131
2020-05-20  Tsaboana    238
2020-05-21  Marary  405
2020-05-21  Sitrana 131
... ... ...
2020-06-28  Sitrana 944
2020-06-28  Tsaboana    1116
2020-06-29  Marary  2138
2020-06-29  Sitrana 966
2020-06-29  Tsaboana    1152
Run Code Online (Sandbox Code Playgroud)

我的目标是显示线图中的最后一个值(图 1):

使用以下代码:

fig ,axes = plt.subplots(ncols=1,nrows=2,constrained_layout=True)

# # ------------------------------Plot first figure --------------------------------------------
palette = ['#F70A0A','#2A930C','#930C85']
sns.set(rc={'figure.figsize':(30,15)},palette= palette, font_scale=1.7)
# # pour les axes 

ax1 = sns.lineplot(x=simple_line_final_df.index,y= 'Totaly olona',data=simple_line_final_df,hue='Madagascar Covid-19',style='Madagascar Covid-19',markers=True,dashes=False,ax=axes[0])

# style 
sns.set_style("darkgrid" , {"ytick.major.size": 10 …
Run Code Online (Sandbox Code Playgroud)

matplotlib seaborn

1
推荐指数
1
解决办法
2822
查看次数

如何在seaborn中为relplot添加标题?

这应该很容易,但我已经尝试了很多东西(基于seaborn relplot:如何控制图例的位置并添加标题如何向Seaborn Facet Plot添加标题以及文档),但没有任何效果。

我尝试过的事情:

g = sns.relplot(x="col1", y="col2", data=df, height=6, aspect=2);
g.add_legend(title="Col1 x Col2");
Run Code Online (Sandbox Code Playgroud)

还:

g = sns.relplot(x="col1", y="col2", data=df, height=6, aspect=2).set_title('Col1 x Col2')
Run Code Online (Sandbox Code Playgroud)

和:

plt.title('Col1 x Col2')
g = sns.relplot(x="col1", y="col2", data=df, height=6, aspect=2);
Run Code Online (Sandbox Code Playgroud)

好吧,没有任何效果。我希望标题位于图表的顶部,就像 plt.title() 通常所做的那样。

python pandas seaborn facet-grid

1
推荐指数
1
解决办法
3668
查看次数

如何在保持原来的宽高比的情况下按百分比增加图形的大小?

我有以下代码来绘制图形

import pandas as pd
import urllib3
import seaborn as sns

decathlon = pd.read_csv("https://raw.githubusercontent.com/leanhdung1994/Deep-Learning/main/decathlon.txt", sep='\t')

fig = sns.scatterplot(data = decathlon,
                      x = '100m', y = 'Long.jump',
                      hue = 'Points', palette = 'viridis')

sns.regplot(data = decathlon,
            x = '100m', y = 'Long.jump',
            scatter = False)
Run Code Online (Sandbox Code Playgroud)

我阅读了类似问题的答案,他们使用了该选项plt.figure(figsize=(20,10))。我想保持原来的外观(宽度与长度的比例),但将图形的大小增加一定百分比以获得更好的外观。

您能否详细说明一下如何操作?


我忘记在上面的代码中添加一行%config InlineBackend.figure_format = 'svg'。不幸的是,当我在下面添加这一行时,答案不起作用。

matplotlib python-3.x seaborn

1
推荐指数
1
解决办法
614
查看次数

如何在 Seaborn 中为同一图形上的直方图生成两个单独的 Y 轴

我想生成一个具有两个 y 轴的图形:(Count来自直方图)和Density(来自 KDE)。

我想sns.displot在 Seaborn 中使用>= v 0.11

import seaborn as sns

df = sns.load_dataset('tips')

# graph 1: This should be the Y-Axis on the left side of the figure
sns.displot(df['total_bill'], kind='hist', bins=10)

# graph 2: This should be the Y-axis on the right side of the figure
sns.displot(df['total_bill'], kind='kde')
Run Code Online (Sandbox Code Playgroud)

我编写的代码生成两个单独的图表;我可以只对两个单独的图形使用分面网格,但我想要更简洁,并将两个单独的网格上的两个 y 轴放置到共享相同 x 轴的单个图形中。

seaborn_tips_dataset_dist

python statistics histogram kernel-density seaborn

1
推荐指数
1
解决办法
8162
查看次数