我正在尝试为x,y点列表生成密度图,每个点都与给定的密度值相关联.看到这张图片,看看我在追求什么.
我尝试在这个答案中应用Joe Kington编写的代码,但它返回错误.numpy.linalg.linalg.LinAlgError: singular matrix
这是MWE我的代码(Joe的代码基本相同,只更改了数据数组):
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate
x = np.array([0.005, 0.018, 0.008, 0.015, 0.016, 0.0135, 0.0155, 0.0155, 0.0105, 0.005, 0.0125, 0.0185, 0.0095, 0.003, 0.019, 0.0175, 0.0165, 0.011, 0.007, 0.0195, 0.017, 0.011, 0.0125, 0.0165, 0.0045, 0.0145, 0.02, 0.0185, 0.001, 0.015, 0.0105, 0.016, 0.0185, 0.0035, 0.0025, 0.0015, 0.0055, 0.0185, 0.005, 0.0135, 0.0175, 0.0095, 0.0095, 0.0115, 0.0025, 0.0105, 0.0015, 0.0045, 0.011, 0.009, 0.0045, …Run Code Online (Sandbox Code Playgroud) 我已经探索了有关该主题的类似问题,但是在直方图上生成漂亮曲线时遇到了一些麻烦。我知道有些人可能会认为这是重复的,但我目前还没有找到任何可以帮助解决我的问题的东西。
虽然数据在这里不可见,但这里有一些我正在使用的变量,以便您可以在下面的代码中看到它们代表什么。
Differences <- subset(Score_Differences, select = Difference, drop = T)
m = mean(Differences)
std = sqrt(var(Differences))
Run Code Online (Sandbox Code Playgroud)
这是我生成的第一条曲线(代码似乎最常见且易于生成,但曲线本身不太适合)。
hist(Differences, density = 15, breaks = 15, probability = TRUE, xlab = "Score Differences", ylim = c(0,.1), main = "Normal Curve for Score Differences")
curve(dnorm(x,m,std),col = "Red", lwd = 2, add = TRUE)
Run Code Online (Sandbox Code Playgroud)
我真的很喜欢这个,但不喜欢曲线进入负区域。
hist(Differences, probability = TRUE)
lines(density(Differences), col = "Red", lwd = 2)
lines(density(Differences, adjust = 2), lwd = 2, col = "Blue")
Run Code Online (Sandbox Code Playgroud)
这是与第一个相同的直方图,但具有频率。看起来还是没那么好看。
h = hist(Differences, density = 15, …Run Code Online (Sandbox Code Playgroud) 如何获得重叠密度曲线下的面积?
我该如何解决 R 的问题?(这里有python的解决方案:计算两个函数的重叠面积)
set.seed(1234)
df <- data.frame(
sex=factor(rep(c("F", "M"), each=200)),
weight=round(c(rnorm(200, mean=55, sd=5),
rnorm(200, mean=65, sd=5)))
)
Run Code Online (Sandbox Code Playgroud)
(来源:http : //www.sthda.com/english/wiki/ggplot2-density-plot-quick-start-guide-r-software-and-data-visualization)
ggplot(df, aes(x=weight, color=sex, fill=sex)) +
geom_density(aes(y=..density..), alpha=0.5)
Run Code Online (Sandbox Code Playgroud)
“图中使用的点由 ggplot_build() 返回,因此您可以访问它们。” 所以现在,我有了积分,我可以将它们提供给 approxfun,但我的问题是我不知道如何减去密度函数。
非常感谢任何帮助!(而且我相信需求量很大,没有现成的解决方案。)
我正在尝试创建一个类似于此的密度图(在 R 中创建):
该图不需要密度级别(例如,在键中找到的),但我正在努力寻找一种方法来创建带有密度图的直方图,而无需合并 R 来创建它。有人告诉我存在一种方法,但似乎无法在任何地方找到它。
我可以找到用箱创建直方图的方法,但我似乎找不到如何包含密度绘图线。我找到了一个例子
来自 Tableau Online,但用户包括在 R 和 Tableau 之间来回切换,我试图避免这样做。
提前致谢!
我正在尝试为ggplot2 中geom_segment的geom_density_ridges绘图添加方法。
library(dplyr)
library(ggplot2)
library(ggridges)
Fig1 <- ggplot(Figure3Data, aes(x = `hairchange`, y = `EffortGroup`)) +
geom_density_ridges_gradient(aes(fill = ..x..), scale = 0.9, size = 1)
ingredients <- ggplot_build(Fig1) %>% purrr::pluck("data", 1)
density_lines <- ingredients %>%
group_by(group) %>% filter(density == mean(density)) %>% ungroup()
p <- ggplot(Figure3Data, aes(x = `hairchange`, y = `EffortGroup`)) +
geom_density_ridges_gradient(aes(fill = ..x..), scale = 0.9, size = 1) +
scale_fill_gradientn( colours = c("#0000FF", "#FFFFFF", "#FF0000"),name =
NULL, limits=c(-2,2))+ coord_flip() +
theme_ridges(font_size = 20, grid=TRUE, …Run Code Online (Sandbox Code Playgroud) 我试图用我的密度图识别异常值。我目前正在使用 seaborn 库来绘制我的数据。我将如何识别异常值?我一直在考虑使用 stats 库实现 Z-score,这是唯一可以实现的方法,这不能在密度图中完成吗?
我想创建一个带有脊线的密度图,其中颜色以跨越某个阈值为条件。
目的是说明收入的分配情况,同时突出显示超过特定阈值(每周 1368 澳元)的收入。我在下面提供了我的尝试的概要图。
ggplot(subset(vic, totalweekslost > 0 & nwe %in% 100:3000),
aes(nwe, fill = nwe > 1368)) +
geom_density()
Run Code Online (Sandbox Code Playgroud)
它不是仅仅改变密度图中单个组内的颜色,而是按照自己的比例创建一个新组。
我想要的是颜色变化在同一组中,并显示出清晰的切点。我可以看到我的代码有什么问题,但我不知道如何创建我想要的东西。
假设我们有两组不同样本量的“a”和“b”。
n = 10000
set.seed(123)
dist1 = round(rnorm(n, mean = 1, sd=0.5), digits = 1)
dist2 = round(rnorm(n/10, mean = 2, sd = 0.2), digits = 1)
df = data.frame(group=c(rep("a", n), rep("b", n/10)), value=c(dist1,dist2))
Run Code Online (Sandbox Code Playgroud)
我想将以下堆积条形图转换为堆积密度图。
library(ggplot2)
ggplot(data=df, aes(x=value, y=(..count..)/sum(..count..), fill=group)) +
geom_bar()
Run Code Online (Sandbox Code Playgroud)
我知道有一个position="stack"密度图选项。然而,结果如下所示,因为密度的高度是相对于组样本大小,而不是总样本大小。因此,在某种程度上,这个小群体的代表性过高。
ggplot(data=df, aes(x=value, fill=group)) +
geom_density(position="stack")
Run Code Online (Sandbox Code Playgroud)
有没有办法创建与上面的条形图相对应的密度图?
有时,当我使用seaborn的displot函数创建直方图时,norm_hist = True,y轴小于PDF的预期值1。其他时候它的值大于一。
例如,如果我跑
sns.set();
x = np.random.randn(10000)
ax = sns.distplot(x)
Run Code Online (Sandbox Code Playgroud)
然后,直方图上的 y 轴将按预期从 0.0 变为 0.4,但如果数据不正常,即使norm_hist = True,y 轴也可能会大到 30。
关于直方图函数的标准化参数,我缺少什么,例如 sns.distplot 的norm_hist?即使我自己通过创建一个新变量来标准化数据:
new_var = data/sum(data)
Run Code Online (Sandbox Code Playgroud)
这样数据总和为 1,无论norm_hist 参数是否为 True,y 轴仍将显示远大于 1 的值(例如 30)。
当 y 轴有这么大的范围时我可以给出什么解释?
我认为发生的情况是我的数据紧密集中在零附近,因此为了使数据的面积等于 1(例如在 kde 下),直方图的高度必须大于 1...但是由于概率不能大于 1 结果是什么意思?
另外,如何让这些函数在 y 轴上显示概率?
density-plot ×10
r ×6
ggplot2 ×5
histogram ×3
python ×3
seaborn ×2
arrays ×1
ggridges ×1
matplotlib ×1
numpy ×1
outliers ×1
r-plotly ×1
scipy ×1
tableau-api ×1