小提琴图的形状对于可视化分组数据的数据分布很有用。每组的大小也可以可视化为“小提琴”的面积。
\n但是当数据是异构的\xef\xbc\x8c时,width某些组的数据太小而无法显示任何有意义的信息(图1中的Fri组)。可以选择width放大seaborn.violinplot绘图的大小。
然而,一旦小规模的群体扩大到合适的规模,大群体就会变得“太大”(图2中的Sat群体)并相互重叠。
\n因此,我的问题是如何为seaborn中的小提琴图分配不同的间隙距离。
\n\n\n演示
\n
生成图 1 的代码:
\nimport seaborn as sns\n\ntips = sns.load_dataset("tips")\nax = sns.violinplot(x="day", y="total_bill", hue="sex",\n data=tips, palette="Set2", split=True,\n scale="count", inner="stick",\n scale_hue=False, bw=.2)\nRun Code Online (Sandbox Code Playgroud)\n
生成图2的代码:
\nimport seaborn as sns\n\ntips = sns.load_dataset("tips")\nax = sns.violinplot(x="day", y="total_bill", hue="sex",\n data=tips, palette="Set2", split=True,\n scale="count", inner="stick", width=2.5\n scale_hue=False, bw=.2) \nRun Code Online (Sandbox Code Playgroud)\n
\n\n你的解决方案是什么?
\n
第一次尝试是增加图形宽度,但它看起来很糟糕,并且在图形中留下太多空白。
\n我尝试将 x 轴上的类别数据映射为数字形式,并且它们之间的距离不同。 …
当我尝试使用 matplotlib 绘制“小提琴图”时,出现以下 ValueError 错误。
ValueError:零大小数组到没有身份的缩减操作最小值
axes[0].violinplot([[1,2,3],[],[2,3,4]])
Run Code Online (Sandbox Code Playgroud)
我希望在左侧和右侧绘制两个小提琴图,并在中间绘制一些东西来代表无效项目。
我应该怎么做才能克服这个问题?
在对的调用geom_violin中ggplot2,您可以通过指定来指定每个小提琴的面积与组成该小提琴的观察次数成正比scale="count"。
我假设这是在内部进行操作的,方法是取一些总面积(我们称此数量X),并将其按比例分配给所有要绘制的小提琴。这就是我想要的,除了如果组之间的N差异足够大,从而导致某些组的N相对较低,这会导致小提琴非常狭窄。在我的情况下,这只会使填充色很难看清。
我认为,至少在我的情况下,可以简单地将X稍微扩展一点,从而使很小的小提琴具有足够的可读性,从而在很大程度上解决该问题。换句话说,我想根据观察次数保留小提琴之间的面积差异,但要增加小提琴之间分配的总面积的“池”,以使每个小提琴变得更大。
任何人都不知道如何实现这一目标?必须为此进行切换。我试着用大惊小怪参数geom_violin,如width,size,violinwidth,等,但至今没有运气...
编辑:编码一个无聊但可重现的“样本”数据集,供人们进行试验。
y = runif(100, 1, 10)
x = as.factor(rep(c(1,2), times=50))
z = as.factor(c(rep(1, 10), rep(2, 90)))
df=data.frame(x, y, z)
ggplot(df, aes(x=x, y=y, fill=z)) + geom_violin(scale="count")
Run Code Online (Sandbox Code Playgroud) 我想用每组中的观察数量来注释我的小提琴情节.所以问题基本上与这个问题相同,除了:
让我们从Seaborn API文档中获取此示例:
import seaborn as sns
sns.set_style("whitegrid")
tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", data=tips)
Run Code Online (Sandbox Code Playgroud)
我希望在小提琴之上有n = 62,n = 19,n = 87,并且n = 76.这可行吗?
查阅有关seaborn的violon 图的文档,我想知道如何在同一轴上绘制两个系列的小提琴图(点1),并且它们是可比较的(点2)。
关于第1点,我想复制每种性别的情节:
fig, ax = plt.subplots()
sns.violinplot(x="day", y="total_bill", hue="smoker",
data=tips, split=True, ax=ax)
Run Code Online (Sandbox Code Playgroud)
我可以在两个子图上做到这一点:
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(211)
sns.violinplot(x="day", y="total_bill", hue="smoker",
data=tips[tips.sex == "Female"], split=True, ax=ax)
ax = fig.add_subplot(212)
sns.violinplot(x="day", y="total_bill", hue="smoker",
data=tips[tips.sex == "Male"], split=True, ax=ax)
Run Code Online (Sandbox Code Playgroud)
我想在相同的matplotlib轴上绘制两个小提琴图系列。
另一点是关于小提琴图的宽度。我不清楚小提琴是否已标准化以及如何标准化?我假设宽度是为每个图计算的。在上面的示例中,为第一个子图计算了女性的宽度,为第二个子图计算了男性的宽度。因此,我可以直接比较密度吗?我想我可以比较这些形状,但是,例如,我不能比较星期一的男性吸烟者和女性的吸烟者数量?有没有办法管理小提琴的标准化?
我有几个组的测量值,我想将它们绘制为小提琴图:
set.seed(1)
df <- data.frame(val = c(runif(100,1,5),runif(100,1,5),rep(0,100)),
group = c(rep("A",100),rep("B",100),rep("C",100)))
Run Code Online (Sandbox Code Playgroud)
使用R的ggplot2:
library(ggplot2)
ggplot(data = df, aes(x = group, y = val, color = group)) + geom_violin()
Run Code Online (Sandbox Code Playgroud)
R但是当我尝试使用's获得等效值时plotly:
library(plotly)
plot_ly(x = df$group, y = df$val, split = df$group, type = 'violin', box = list(visible = F), points = F, showlegend = T, color = df$group)
Run Code Online (Sandbox Code Playgroud)
“C”组获得一把充气/人造小提琴。
知道如何处理这个问题而不是使用 吗ggplotly?
这是一个最小的可重现示例:
library(ggplot2)
mydata <- data.frame(condition = c(rep("One",40), rep("Two",40)),
participant = rep(1:40,2),
observation = c(rnorm(40,2,1), rnorm(40,0,1)))
#my.plot <- ggplot(mydata, aes(x=condition, y=observation, group=participant)) +
my.plot <- ggplot(mydata, aes(x=condition, y=observation)) +
geom_point(size=3) +
geom_line(size=1, alpha=0.5) +
xlab('condition') +
ylab('Observation')
dataDensity <- mydata %>%
group_by(condition) %>%
do(data.frame(loc = density(.$observation)$x,
dens = density(.$observation)$y,
participant=1))
dataDensity$dens <- ifelse(dataDensity$condition == "One", .9+(dataDensity$dens * -1), 2.1+(dataDensity$dens))
my.plot + geom_polygon(data = dataDensity, aes(dens, loc, fill = condition))
Run Code Online (Sandbox Code Playgroud)
这接近我想要的,但不完全。我实际上想将条件“一”和“二”之间的每个对应点对分组。因此,当我添加分组变量时(就像我在上面的代码片段中注释掉的行一样),我遇到了这个问题:
这很有趣,但不是我所追求的。
我必须添加 hack/workaroundparticipant=1以防止出现错误消息:
FUN(X[[i]], ...) 中的错误:找不到对象“参与者”
如何将分散的点与分组变量相结合,但保持分离的小提琴独立?
(注意:第一个图中的垂直线只是因为我有 …
我正在尝试在R中产生一组小提琴图的变体(最好使用ggplot2),类似于以下示例:
由以下可重现的示例代码产生:
# Load libraries #
library(tidyverse)
# Create dummy data #
set.seed(321)
df <- data.frame(X = rep(c("X1", "X2"), each = 100),
Y = rgamma(n = 200, shape = 2, rate = 2),
Z = rep(c("Za", "Zb"), rep = 100),
stringsAsFactors = FALSE)
# Grouped violin plot #
df %>%
ggplot(., aes(x = X, y = Y, fill = Z)) +
geom_violin(draw_quantiles = 0.5) +
scale_fill_manual(values = c("Za" = "red", "Zb" = "blue"))
Run Code Online (Sandbox Code Playgroud)
我想拥有的变化是,中位数以上的密度与中位数以下的密度应具有不同的阴影,如下图所示:
我使用以下代码为组合X …
我希望在 seaborn.violinplot 中有越来越透明的小提琴。我尝试了以下方法:
import seaborn as sns
tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", data=tips, color='r', alpha=[0.8, 0.6, 0.4, 0.2])
Run Code Online (Sandbox Code Playgroud)
Which does not result in the desired output:
violin-plot ×10
python ×6
seaborn ×5
matplotlib ×4
r ×4
ggplot2 ×3
pandas ×1
plot ×1
plotly ×1