- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 seaborn 的新手,如果这是一个简单的问题,我深表歉意,但我无法在文档中的任何地方找到关于如何在 kdeplot 中控制 n_levels 绘制的级别的描述。这是一个例子:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
x,y=np.random.randn(2,10000)
fig,ax=plt.subplots()
sns.kdeplot(x,y, shade=True,shade_lowest=False, ax=ax,n_levels=3,cmap="Reds")
plt.show()
这是结果图:
我想知道显示的置信水平是多少,这样我就可以将我的绘图标记为“阴影区域显示 (a,b,c) 百分比置信区间。”我会天真地假设 n_levels 在某种程度上与高斯中的等效“西格玛”有关,但从这个例子来看情况并非如此。
理想情况下,我希望能够通过将元组传递给 kdeplot 来指定显示的间隔,例如:
levels=[68,95,99]
并绘制这些置信区域。
编辑:感谢@Goyo 和@tom,我想我可以澄清我的问题,并找到我正在寻找的答案。正如所指出的,n_levels
被作为 levels
传递给 plt.cotourf
,因此可以传递一个列表。但是 sns.kdeplot
绘制了 PDF,并且 PDF 中的值与我正在寻找的置信区间不对应(因为这些对应于 PDF 的集成)。
我需要做的是将集成(和规范化)PDF 的 x,y
值传递给 sns.kdeplot
,然后我就可以输入例如n_levels=[0.68,0.95,0.99,1]
。
编辑 2:我现在已经解决了这个问题。见下文。我使用二维标准化直方图来定义置信区间,然后将其作为水平传递给标准化 kde 图。为重复道歉,我可以创建一个函数来返回级别,但我明确地输入了所有内容。
import numpy as np
import scipy.optimize
import matplotlib.pyplot as plt
import seaborn as sns
# Generate some random data
x,y=np.random.randn(2,100000)
# Make a 2d normed histogram
H,xedges,yedges=np.histogram2d(x,y,bins=40,normed=True)
norm=H.sum() # Find the norm of the sum
# Set contour levels
contour1=0.99
contour2=0.95
contour3=0.68
# Set target levels as percentage of norm
target1 = norm*contour1
target2 = norm*contour2
target3 = norm*contour3
# Take histogram bin membership as proportional to Likelihood
# This is true when data comes from a Markovian process
def objective(limit, target):
w = np.where(H>limit)
count = H[w]
return count.sum() - target
# Find levels by summing histogram to objective
level1= scipy.optimize.bisect(objective, H.min(), H.max(), args=(target1,))
level2= scipy.optimize.bisect(objective, H.min(), H.max(), args=(target2,))
level3= scipy.optimize.bisect(objective, H.min(), H.max(), args=(target3,))
# For nice contour shading with seaborn, define top level
level4=H.max()
levels=[level1,level2,level3,level4]
# Pass levels to normed kde plot
fig,ax=plt.subplots()
sns.kdeplot(x,y, shade=True,ax=ax,n_levels=levels,cmap="Reds_d",normed=True)
ax.set_aspect('equal')
plt.show()
现在生成的图如下:
级别比我预期的要宽一些,但我认为这是正确的。
最佳答案
水平不是置信区间或西格玛,而是估计 pdf 的值。您能够将级别作为列表而不是 n_levels 传递。
编辑
Seaborn 只是策划事情。它不会给你估计的 pdf,只是一个 matplotlib 轴。因此,如果您想使用 kde pdf 进行计算,则必须自己进行估算。
Seaborn 在后台使用 statsmodels 或 scipy,因此您也可以这样做。 Statsmodels 也可以为您提供 cdf,如果这是您正在寻找的(也许是 scipy,但我不确定)。您可以计算您感兴趣的级别,评估网格中的 pdf 并将所有内容传递给 contourf,这或多或少是 seaborn 所做的。
不幸的是我不够熟练你给你更多关于这个的建议(我只是偶尔使用 statsmodels 进行 OLS 回归)但是你可以看看 kdeplot
的代码并弄清楚。
关于python - 在 seaborn kdeplot 中设置置信度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35225307/
我想用 seaborn.kdeplot 创建核密度估计侧面有一个颜色条。 import matplotlib.pyplot as plt import seaborn as sns import nu
我喜欢 multiple bivariate KDE plots 的 Seaborn 示例,但我希望在该示例中使用标准的 matplotlib 图例而不是自定义标签。 这是我尝试使用图例的示例: im
我正在尝试在 map (Shapefile) 上绘制 Seaborn 内核密度。 为了生成内核密度,我在 Seaborn Website 中使用了以下代码 x, y = np.random.multi
我正在尝试在我的 kdeplot 中自定义我的阴影颜色。 我想使用这个调色板,从浅绿色到#3bd6b0颜色至少有 15 个级别(但以后可能会更多)。为了做到这一点,我使用了 sns.light_pal
我有一个包含 ~900 行的数据框;我正在尝试为某些列绘制 KDEplots。在某些列中,大多数值是相同的最小值。当我包含太多最小值时,KDEPlot 会突然停止显示最小值。例如,以下包括 600 个
我正在尝试获取 Seaborn kdeplot处理我的数据集的示例。由于某种原因,我的一个数据集根本没有绘制,但另一个似乎绘制得很好。为了获得最小的工作示例,我仅从非常大的数据集中采样了 10 行。
我正在使用 kdeplot像这样绘制两个双变量分布的密度,其中 df_c 和 df_n 是两个 Pandas DataFrame: f, ax = plt.subplots(figsize=(6, 6
我正在使用 seaborn 创建一个边缘分布的 kdeplot,如 this answer 中所述。 .我稍微调整了代码,得到了这个: import matplotlib.pyplot as plt
我想从 jupyter notebook 中的文档执行以下示例:https://seaborn.pydata.org/generated/seaborn.kdeplot.html tips = sns
seaborn.kdeplot 的每个 hue 组如何? , 或 seaborn.displot与 kind='kde' 被赋予不同的 linestyle? 轴级和图形级选项都将接受 linestyl
我写了一个类来绘制一些数据点。我使用 seaborn 制作了 kernel density 图,它导致 (1) 框架消失了,我想要一个刚性框架,并且 (2) 图中有网格与 (3) 我想摆脱它们的背景颜
我是 seaborn 的新手,如果这是一个简单的问题,我深表歉意,但我无法在文档中的任何地方找到关于如何在 kdeplot 中控制 n_levels 绘制的级别的描述。这是一个例子: import s
我希望能够在 y 轴边距上绘制多个重叠的 kde 图(不需要 x 轴边距图)。每个 kde 图都对应于颜色类别(有 4 个),因此我将有 4 个 kde,每个描绘其中一个类别的分布。据我所知: imp
这是我的代码 import numpy as np from numpy.random import randn import pandas as pd from scipy import stats
是否可以在绘图之前从 sns.kdeplot() 中提取数据?IE。不使用功能y.get_lines()[0].get_data() 绘图后 最佳答案 这可以通过从 matplotlib Axes 对
下面的 kdeplot 在左边有一个峰值,我想更关注它: a = np.array([1] * 100 + [5]) sns.kdeplot(a) 我通常这样做的方法是 pyplot.xlim调用,但
我想在数据框中的 (x, y) 坐标提供的 NHL 溜冰场的背景图像上绘制 NHL 投篮及其分布(通过 Seaborn kdeplot)。我的代码生成的绘图 99% 达到了我想要的位置,但我不是 10
下面的线列表表示一组线(比方说,对于某些化学光谱),以 MHz 为单位。我知道用于探测这些线的激光线宽为 5 MHz。因此,天真地,这些带宽为 5 的线的核密度估计应该给我在使用上述激光的实验中产生的
我正在尝试绘制与 seaborn 文档中描述的情况非常相似的情况 http://seaborn.pydata.org/tutorial/axis_grids.html#plotting-pairwis
我正在尝试使用 Seaborn 的 kdeplot 制作一个漂亮的自由能表面(热图)。 我非常接近,但无法想出改变颜色条比例的方法。颜色条标尺很重要,因为它应该代表 map 上不同坐标处的能量差异。我
我是一名优秀的程序员,十分优秀!