在对的调用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从0.5.1更新到新的0.6.0版本.我一直在使用seaborn在python笔记本中制作盒子图和小提琴图,现在我似乎无法使我的代码工作了.Matplotlib plt.boxplot仍然适用于我的数据.特别是,当我有一组列表或数组,其中子集的大小不同时,似乎会出现问题.
例如:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
x = np.array([1,3,4]), ([1,2])
plt.boxplot(x) #this works
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
x = np.array([1,3,4]), ([1,2])
sns.boxplot(x) #doesn't work
Run Code Online (Sandbox Code Playgroud)
这是我尝试seaborn box plot时得到的错误
ValueError:boxplot统计信息列表和`position`值必须具有相同的长度
在新的seaborn教程中,它说sns.boxplot应该采取一切措施plt.boxplot.有没有人有同样的更新问题?有没有办法使这项工作?如果没有,有没有办法安装0.6.0版本和0.5.1版本并在某些笔记本电脑中调用特定版本?
使用Seaborn,我可以创建一个.使其垂直是没有问题的.但我想要一个水平的小提琴情节.我看到建议在violinplot函数中传递参数时只需切换x和y .
我希望获得相同的小提琴曲线,旋转90度,并且只能通过切换x和y来实现这一点.这是一个简单的例子:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
categories = pd.Series(['2008', '2008', '2008', '2009', '2009' ])
values = pd.Series(np.random.normal(0,1, 5))
sns.violinplot( x=categories, y=values, linewidth=5)
plt.show()
sns.violinplot( y=categories, x=values, linewidth=5)
plt.show()
Run Code Online (Sandbox Code Playgroud)
这两张图.第一个是垂直小提琴情节,这是预期的.但第二个不是类似的水平小提琴情节.调用第二个绘图的命令出了什么问题?
我有一个df包含以下数据的数据框。我想绘制logCPM两组 A 和 B 之间基因的表达。
Samples Type GeneA
Sample1 B 14.82995162
Sample2 B 12.90512275
Sample3 B 9.196524783
Sample4 A 19.42866012
Sample5 A 19.70386922
Sample6 A 16.22906914
Sample7 A 12.48966785
Sample8 B 15.53280377
Sample9 A 9.345795955
Sample10 B 9.196524783
Sample11 B 9.196524783
Sample12 B 9.196524783
Sample13 A 9.434355615
Sample14 A 15.27604692
Sample15 A 18.90867329
Sample16 B 11.71503095
Sample17 B 13.7632545
Sample18 A 9.793864295
Sample19 B 9.196524783
Sample20 A 14.52562066
Sample21 A 13.85116605
Sample22 A 9.958492229
Sample23 A …Run Code Online (Sandbox Code Playgroud) 我有一个在不同景观上运行的模型,一次同时运行,一次单独运行。我想在小提琴图中绘制结果,但我希望在同一个图中并排运行,并且每个景观都有自己的小提琴(所以2 堆 4 把小提琴)。示例数据:
df1 <- data.frame('means' = 1:6, 'landscape' = rep(c('forest', 'desert', 3)))
df2 <- data.frame('means' = rep(c(1,2), 3), 'landscape' = rep(c('forest', 'desert', 3)))
Run Code Online (Sandbox Code Playgroud)
我希望最终产品看起来如何(MS Paint 中的插图,我是一个糟糕的艺术家):

绿色代表森林,金色代表沙漠。
创建一个小提琴图的正确方法是什么hue?
我尝试了不同的方法,似乎唯一的方法是为数据集中的每个条目创建一个共享相同值的特征。并将该功能的名称作为x.
fig = plt.figure(figsize=(20, 8))
fig.add_subplot(1, 3, 1)
ax = sns.violinplot(x='feature', y='height',
data=train_cleansed_height,
scale='count',
hue='feature', split=True,
palette='seismic',
inner='quartile')
fig.add_subplot(1, 3, 2)
ax = sns.violinplot(x='workaround', y='height',
data=train_cleansed_height,
scale='count',
hue='feature', split=True,
palette='seismic',
inner='quartile')
fig.add_subplot(1, 3, 3)
ax = sns.violinplot(x=None, y='height',
data=train_cleansed_height,
scale='count',
hue='feature', split=True,
palette='seismic',
inner='quartile')
plt.xlabel('x=None')
Run Code Online (Sandbox Code Playgroud)
但这是正确的方法吗?
以下用于在ggplot2中生成小提琴图:
ggplot(violin,aes(x=variable,y=log(value+0.5),color=Group)) +
geom_violin(scale="width") +
geom_jitter(aes(group=Group), position=position_jitterdodge()) +
stat_summary(fun.y="mean",geom="crossbar", mapping=aes(ymin=..y.., ymax=..y..),
width=1, position=position_dodge(),show.legend = FALSE) +
theme(axis.text.x = element_text(angle = 45, margin=margin(0.5, unit="cm")))
Run Code Online (Sandbox Code Playgroud)
得到的情节看起来如下;
正如你所看到的,有些点在小提琴形状的边界外抖动,我需要把这些点放在小提琴里面.我玩过不同程度的抖动,但都取得了成功.我很欣赏任何能够实现这一目标的指示.
我有一个随时间变化的分布,我想使用seaborn为每个时间并排绘制小提琴图。我最初尝试为失败violinplot无法处理np.ndarray的y参数:
import numpy as np
import seaborn as sns
time = np.arange(0, 10)
samples = np.random.randn(10, 200)
ax = sns.violinplot(x=time, y=samples) # Exception: Data must be 1-dimensional
Run Code Online (Sandbox Code Playgroud)
seaborn文档有一个按分类变量分组的垂直小提琴图示例。但是,它使用长格式的 DataFrame。
我是否也需要将我的时间序列转换为 DataFrame?如果是这样,我如何实现这一目标?
我的数据框充满了我用来识别一组图像上的兴趣点的模型的可能性。行对应于图像,列对应于标签。标签有“左”和“右”版本。我想使用split=True关键字来显示同一小提琴图上的 L 和 R 侧。
我已经为标签“LH1”和“RH1”创建了单独的小提琴图,如下所示:
但我试图用 5 把小提琴制作一个情节,左右分开。就像seaborn 的这个例子一样:
Seaborn 需要一个hue参数,我想在我的例子中将是分类信息“左”或“右”。因此,我重组/重塑了我的数据框,删除了标签中的“L”或“R”前缀,并将信息添加为“手性”列下的类别。这大约是我目前所拥有的:
df = pd.DataFrame.from_dict(
{'H1': {0: 0.55, 1: 0.56, 2: 0.46, 3: 0.93, 4: 0.74, 5: 0.35, 6: 0.75, 7: 0.86, 8: 0.81, 9: 0.88},
'H2': {0: 0.5, 1: 0.55, 2: 0.61, 3: 0.82, 4: 0.51, 5: 0.35, 6: 0.58, 7: 0.66, 8: 0.93, 9: 0.86},
'H3': {0: 0.42, 1: 0.51, 2: 0.86, 3: 0.59, 4: 0.46, 5: 0.71, 6: 0.58, 7: 0.72, 8: 0.53, …Run Code Online (Sandbox Code Playgroud) violin-plot ×10
seaborn ×6
ggplot2 ×4
python ×4
r ×4
matplotlib ×3
pandas ×2
python-3.x ×2
boxplot ×1
dataframe ×1
ggpubr ×1
numpy ×1
plot ×1
time-series ×1