我想用ggplot创建一个分裂小提琴密度图,就像seaborn文档的这个页面上的第四个例子一样.
这是一些数据:
set.seed(20160229)
my_data = data.frame(
y=c(rnorm(1000), rnorm(1000, 0.5), rnorm(1000, 1), rnorm(1000, 1.5)),
x=c(rep('a', 2000), rep('b', 2000)),
m=c(rep('i', 1000), rep('j', 2000), rep('i', 1000))
)
Run Code Online (Sandbox Code Playgroud)
我可以像这样绘制躲闪的小提琴:
library('ggplot2')
ggplot(my_data, aes(x, y, fill=m)) +
geom_violin()
Run Code Online (Sandbox Code Playgroud)
但是在视觉上比较并排分布中不同点的宽度很难.我无法在ggplot中找到任何拆分小提琴的例子 - 这可能吗?
我找到了一个基本的R图形解决方案,但功能很长,我想突出显示分布模式,这些模式很容易在ggplot中作为附加层添加,但如果我需要弄清楚如何编辑该功能将更难.
有没有办法改变violinmatplotlib 中的图的颜色?
默认颜色是这种"褐色"颜色,这不是太糟糕,但我想要着色,例如,前3个小提琴不同以突出它们.我在文档中找不到任何参数.任何想法或黑客颜色不同的小提琴?

在我的绘图上使用对数刻度时,我的小提琴绘图显示奇怪的格式。我尝试过使用 matplotlib 和 seaborn,得到了非常相似的结果。
import matplotlib.pyplot as plt
import seaborn as sns
data = [[1e-05, 0.00102, 0.00498, 0.09154, 0.02009, 1e-05, 0.06649, 0.42253, 0.02062, 0.10812, 0.07128, 0.03903, 0.00506, 0.13391, 0.08668, 0.04127, 0.00927, 0.00118, 0.063, 0.18392, 0.05948, 0.07774, 0.14018, 0.0133, 0.00339, 0.00271, 0.05233, 0.00054, 0.0593, 1e-05, 0.00076, 0.03409, 0.71491, 0.02311, 0.10246, 0.12491, 0.05164, 0.1553, 0.01079, 0.01734, 0.02239, 0.1347, 0.02877, 0.04752, 0.00333, 0.04553, 0.03189, 0.00947, 0.00158, 0.00888, 0.12663, 0.07531, 0.12367, 0.11346, 0.06638, 0.06154, 1e-05, 0.1838, 0.08659, 0.05654, 0.07658, 0.0348, 0.02954, 0.0123, 0.01529, 0.05559, …Run Code Online (Sandbox Code Playgroud) 我正在使用 seaborn 创建小提琴图。现在我正在创建不成比例的小提琴图(所以所有值都在 0 和 1 之间),但生成的小提琴图很不合适。它的底部范围为负值,其顶部范围为大于 1 的值。下面是我运行以测试它的示例:
import seaborn as sns
import numpy as np
y = np.asarray([.1725,.1825,.163,.1625,.93,.943,.893,.93,.11225,.93,.812,.832,.9425,.953,.8525,.993,.963,.1425,.113,.752])
x = np.asarray([1]*len(data))
sns.violinplot(x=x,y=y)
sns.plt.show()
Run Code Online (Sandbox Code Playgroud)
显然没有一个值超出范围 [0,1],但小提琴图看起来很奇怪:
帮助将不胜感激!
我发现小提琴图信息丰富且有用,我使用 python 库“seaborn”。然而,当应用于正值时,它们几乎总是在低端显示负值。我发现这确实具有误导性,尤其是在处理现实数据集时。
在seaborn的官方文档中https://seaborn.pydata.org/ generated/seaborn.violinplot.html可以看到带有“total_bill”和“tip”的示例,它们不能为负数。然而,小提琴图显示负值。例如,
import seaborn as sns
sns.set(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", hue="smoker",data=tips, palette="muted", split=True)
Run Code Online (Sandbox Code Playgroud)
我确实明白,这些负值来自高斯核。因此,我的问题是:有什么办法可以解决这个问题吗?python 中的另一个库?可以指定不同的内核吗?
试图弄清楚如何修改 seaborn violinplot 中四分位数的线条属性(颜色、粗细、样式等)。
来自他们网站的示例代码:
import seaborn as sns
sns.set(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", hue="sex",
data=tips, palette="Set2", split=True,linestyle=':',
scale="count", inner="quartile")
Run Code Online (Sandbox Code Playgroud)
期望的结果是能够单独更改小提琴图的两个部分的颜色,例如像这样提高可读性:
我怎样才能做到这一点?
感谢您的任何见解
更新:根据@kynnem 的响应,以下内容可用于分别更改中位数和四分位数线:
import seaborn as sns
sns.set(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", hue="sex",
data=tips, palette="Set2", split=True,linestyle=':',
scale="count", inner="quartile")
for l in ax.lines:
l.set_linestyle('--')
l.set_linewidth(0.6)
l.set_color('red')
l.set_alpha(0.8)
for l in ax.lines[1::3]:
l.set_linestyle('-')
l.set_linewidth(1.2)
l.set_color('black')
l.set_alpha(0.8)
Run Code Online (Sandbox Code Playgroud)
结果:
我有从Excel电子表格中读取的数据.该数据对于六种情景S1至S6中的每一种都有许多观察结果.当我将数据读入我的数据帧df时,它看起来如下:
Scenario LMP
0 S1 -21.454544
1 S1 -20.778094
2 S1 -20.027689
3 S1 -19.747170
4 S1 -20.814405
5 S1 -21.955406
6 S1 -23.018960
...
12258 S6 -34.089906
12259 S6 -34.222814
12260 S6 -26.712010
12261 S6 -24.555973
12262 S6 -23.062616
12263 S6 -20.488411
Run Code Online (Sandbox Code Playgroud)
我想创建一个小提琴图,它为六种场景中的每一种都有不同的小提琴.我是Pandas和数据框架的新手,尽管在最后一天进行了大量的研究/测试,我还是无法找到一种优雅的方法将一些参考传递给我的数据框(将它分成不同的系列用于每个场景)将在axes.violinplot()语句中工作.例如,我尝试了以下,但不起作用.我在我的axes.violinplot语句中得到一个"ValueError:无法将大小为1752的序列复制到维度为2的数组轴".
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# load data into a dataframe
df = pd.read_excel('Modeling analysis charts.xlsx',
sheetname='lmps',
parse_cols=[7,12],
skiprows=0,
header=1)
fontsize = 10
fig, axes = plt.subplots()
axes.violinplot(dataset = …Run Code Online (Sandbox Code Playgroud) 我想要只有一半的小提琴图(类似于 ggridges 的 stat_density_ridges 创建的图)。MWE
library(ggplot2)
dframe = data.frame(val = c(), group = c())
for(i in 1:5){
offset = i - 3
dframe = rbind(dframe,
data.frame(val = rnorm(n = 50, mean = 0 - offset), group = i)
)
}
dframe$group = as.factor(dframe$group)
ggplot(data = dframe, aes(x = group, y = val)) +
geom_violin()
Run Code Online (Sandbox Code Playgroud)
产生这样的情节
我虽然想要一个看起来像这样的:
理想情况下,这些图也可以缩放到宽度的 1.5 到 2 倍。
小提琴图的形状对于可视化分组数据的数据分布很有用。每组的大小也可以可视化为“小提琴”的面积。
\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 轴上的类别数据映射为数字形式,并且它们之间的距离不同。 …
violin-plot ×10
python ×8
seaborn ×7
matplotlib ×6
ggplot2 ×2
pandas ×2
r ×2
ggproto ×1
plot ×1
quartile ×1