我正在寻找一种根据“色调”绘制带有堆叠条的计数图的有效方法。标准色调行为是根据第二列的值将计数拆分为平行条,我正在寻找的是一种将色调条堆叠以便快速比较总数的有效方法。
让我用一个来自泰坦尼克号数据集的例子来解释:
import pandas as pd
import numpy as np
import seaborn as sns
%matplotlib inline
df = sns.load_dataset('titanic')
sns.countplot(x='survived',hue='class',data=df)
Run Code Online (Sandbox Code Playgroud)
提供带有计数图和色调的标准 Seaborn 行为

我正在寻找的是类似于每个色调的堆叠条

为了获得最后一张图片,我使用了以下代码
def aggregate(rows,columns,df):
column_keys = df[columns].unique()
row_keys = df[rows].unique()
agg = { key : [ len(df[(df[rows]==value) & (df[columns]==key)]) for value in row_keys]
for key in column_keys }
aggdf = pd.DataFrame(agg,index = row_keys)
aggdf.index.rename(rows,inplace=True)
return aggdf
aggregate('survived','class',df).plot(kind='bar',stacked=True)
Run Code Online (Sandbox Code Playgroud)
我相信有一些更有效的方法。我知道 seaborn 对堆叠条形不太友好……所以我尝试用我的函数重新排列数据集并使用 matplotlib,但我想还有一种更聪明的方法可以做到这一点。
非常感谢!
我想用seaborn包创建一个catplot,我知道为了能够做到这一点,我需要最新版本的seaborn(0.9.0).我用conda安装了包:
conda install seaborn
Run Code Online (Sandbox Code Playgroud)
但它下载的版本为0.8.1.
因此我使用pip安装了我想要的版本:
pip3 install seaborn==0.9.0
Run Code Online (Sandbox Code Playgroud)
但是每当我运行我的代码时,我都会遇到同样的错误: AttributeError:module'seaborn'没有属性'catplot'(仅在最新版本中提供的属性).
有人可以帮忙吗?
默认情况下,seaborn 在 distplots 中置换 X 轴范围从 -5 到 35。但我需要用 1 个单位显示 X 轴范围从 1 到 30 的 distplots。我怎样才能做到这一点?
想象一下,我有一个包含 9 列的数据框。我希望能够达到与 df.hist() 相同的效果,但使用 sns.distplot()。
换句话说,我希望能够在 3 行 3 列的可视化中绘制数据框中每一列的 sns.distplot(),其中每个子图代表每列的唯一 sns.distplot() 总计数据框中的列数。
我对数据框的轴和列使用 for 循环进行了一些试验,但我只能获得指定列的结果。我不确定如何表示适用于行和列的代码。
我还研究了 sns.FacetGrid,但我不确定如何使用 FacetGrid 解决这个问题。
我发现 df.hist() 函数正是我想要的,但我希望能够使用 sns.distplot 来完成与 df.hist() 输出相同的表示形式中的所有列。
如果它有助于放置数据框的上下文,我基本上是在阅读 Google Colab 的加利福尼亚住房数据集的训练和测试集,其中包含除 Ocean_proximity 之外的所有列。如果您想使用该数据集帮助我解决这个问题,请从 Kaggle 获取并删除 Ocean_proximity 列。
我的 9 列方法:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('housing.csv')
df.drop('ocean_proximity', axis=1, inplace=True)
fig, axes = plt.subplots(ncols=len(df.columns), figsize=(30,15))
for ax, col in zip(axes, df.columns):
sns.distplot(df[col], ax=ax)
plt.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud) 我无法为 seaborn 线图正确设置 x 轴刻度标签。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.DataFrame({'a':np.random.rand(8),'b':np.random.rand(8)})
sns.set(style="darkgrid")
g = sns.lineplot(data=df)
g.set_xticklabels(['2011','2012','2013','2014','2015','2016','2017','2018'])
Run Code Online (Sandbox Code Playgroud)
x 轴上的年份未正确对齐。
我无法更改 seaborn 中 2d 线的颜色。我的图中有 2 条线,我想为它们分配不同的颜色。
sns.set(style="whitegrid")
data = pd.DataFrame(result_prices, columns=['Size percentage increase'])
data2 = pd.DataFrame(result_sizes, columns=['Size percentage increase'])
sns_plot = sns.lineplot(data=data, color='red', linewidth=2.5)
sns_plot = sns.lineplot(data=data2, linewidth=2.5)
sns_plot.figure.savefig("size_percentage_increase.png")
Run Code Online (Sandbox Code Playgroud)
但是color='red'不变色,为什么呢?
我有一个箱线图,需要删除 x 轴('user_type' 和 'member_gender')标签。鉴于以下格式,我该怎么做?
sb.boxplot(x="user_type", y="Seconds", data=df, color = default_color, ax = ax[0,0], sym='').set_title('User-Type (0=Non-Subscriber, 1=Subscriber)')
sb.boxplot(x="member_gender", y="Seconds", data=df, color = default_color, ax = ax[1,0], sym='').set_title('Gender (0=Male, 1=Female, 2=Other)')
Run Code Online (Sandbox Code Playgroud) 我有一个dd包含 84 行和 3 列的数据框。
现在我想用它绘制一个区域图,并使用它的索引作为 xticks,所以我执行以下操作:
dd.plot(kind='area')
plt.show()
Run Code Online (Sandbox Code Playgroud)
(PS 我没有足够的声誉来张贴图片,所以我把这个链接放在这里。)
结果发现有些xticks是自动隐藏的:应该有84个xticks,但是只显示了9个(好像是自动隐藏的)。
我在这里找到了一个类似的问题,但是当我尝试链接中提到的方法时,我得到了一个CnoversionError:
ConversionError: Failed to convert value(s) to axis units: Index(['!', '"', '#', '$', '%', '&', ''', '(', ')', '*', '+', ',', '-', '.',
'/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<',
'=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', …Run Code Online (Sandbox Code Playgroud) 我有一些 seaborn 线图,但我不知道如何增加线条的宽度。
这是我的代码
#graph 1
sns.lineplot(x="date", y="nps", data=df_nps, ax=ax1, label="NPS", color='#0550D0')
sns.lineplot(x="date", y="ema28", data=df_nps, ax=ax1, label="EMA28", color='#7DF8F3')
sns.lineplot(x="date", y="ema7", data=df_nps, ax=ax1, label="EMA7", color='orange')
#graph 2
dfz_nps_lineplot = sns.lineplot(x="date", y="nps", data=dfz_nps, ax=ax2, label="NPS", color='#0550D0')
dfz_nps_lineplot = sns.lineplot(x="date", y="ema28", data=dfz_nps, ax=ax2, label="EMA28", color='#7DF8F3')
dfz_nps_lineplot = sns.lineplot(x="date", y="ema7", data=dfz_nps, ax=ax2, label="EMA7", color='orange')
#graph3
dfp_nps_lineplot = sns.lineplot(x="date", y="nps", data=dfp_nps, ax=ax3, label="NPS", color='#0550D0')
dfp_nps_lineplot = sns.lineplot(x="date", y="ema28", data=dfp_nps, ax=ax3, label="EMA28", color='#7DF8F3')
dfp_nps_lineplot = sns.lineplot(x="date", y="ema7", data=dfp_nps, ax=ax3, label="EMA7", color='orange')
# formatting
plt.show()
Run Code Online (Sandbox Code Playgroud)
这就是我的线图现在的样子。
根据 seaborn 文档,这里 seaborn.distplot()已被弃用,支持的图为:seaborn.displot()和seaborn.histplot()。
但是,当我尝试使用displot()或 时histplot()出现以下属性错误:
AttributeError: module 'seaborn' has no attribute 'displot'
注意我可以成功运行seaborn.jointplot()和其他各种。
我发现这个 SO post Module Seaborn 没有属性 ''但这似乎不是我问题的解决方案。
我已经seaborn版本0.10.1我安装的MacOS版本10.15.5(19F101)
我今天早些时候有seaborn 0.9.0并且遇到了同样的问题,所以我使用App Cleaner & Uninstaller应用程序删除了我的Anaconda发行版并重新安装。现在我有seaborn 版本 0.10.1。
Anaconda的全新安装不应该处理所有依赖项和要求吗?
请参见下面的属性错误屏幕截图。任何想法发生了什么?
更新:
上面的图似乎最近才从seaborn 0.11.0开始可用。所以我正在尝试通过以下方式安装新的 seaborn:conda install seaborn==0.11.0但是conda和/或频道似乎有问题。它试图解决环境问题,但它处于永无止境的循环中。我终止了这个过程,然后再试一次,同样的事情。
(base)MacBook-Air:$ conda install seaborn==0.11.0
Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial …Run Code Online (Sandbox Code Playgroud) python ×10
seaborn ×10
pandas ×4
matplotlib ×3
anaconda ×1
bar-chart ×1
colors ×1
conda ×1
data-science ×1
numpy ×1
python-3.x ×1