我想使用 matplotlib 或 Searborn 创建一个小提琴图,其中该图根据颜色图进行着色。
这就是我得到的:
怎样才能得到想要的图呢?
我正在使用seaborn violinplot 绘制特定年份股票指数每日收益的分布。然而,图表上的一些极值看起来绘制不正确。
\n\n下图是一年的示例。正如您所看到的,“Pi\xc4\x85tek\”的最低值接近 -6。
\n\nsns.violinplot( x=wig20.iloc[1500:1751,3], y=wig20.iloc[1500:1751,2], width=1, order=[\'Poniedzia\xc5\x82ek\',\'Wtorek\',\'\xc5\x9aroda\',\'Czwartek\',\'Pi\xc4\x85tek\'])\nRun Code Online (Sandbox Code Playgroud)\n\n
数据看起来像:
\n\nwig20.iloc[1500:1751,0:4].head()\n\n Date wig20 [%] weekday\n1500 2016-01-04 1804.42 -2.943818 Poniedzia\xc5\x82ek\n1501 2016-01-05 1792.01 -0.687756 Wtorek\n1502 2016-01-07 1745.46 -2.597642 Czwartek\n1503 2016-01-08 1725.14 -1.164163 Pi\xc4\x85tek\n1504 2016-01-11 1703.78 -1.238160 Poniedzia\xc5\x82ek\nRun Code Online (Sandbox Code Playgroud)\n\n但是当我检查数据时我可以看到
\n\nwig20.iloc[1500:1751,2].min()\n\n-4.533610974747937\nRun Code Online (Sandbox Code Playgroud)\n\n因此该图表完全具有误导性。在上面的图表中,“Pi\xc4\x85tek\”的低点肯定低于 -5。我检查了不同的年份,似乎每个大于 4 的最大/最小值都接近图表上的 6,我不知道为什么会这样。
\n如何创建包含各个数据点的小提琴图?
下面的代码显示小提琴和彼此相邻的各个数据点;但是,我希望小提琴将这些点包围起来(洋红色箭头),而不是彼此相邻?
import plotly.express as px
df = px.data.tips()
fig = px.violin(df, y="total_bill", box=False, # draw box plot inside the violin
points='all', # can be 'outliers', or False
)
fig.show()
Run Code Online (Sandbox Code Playgroud)
我想根据字典制作小提琴图。这是我的字典的示例,尽管我的实际字典有更多的患者和更多的值。
paired_patients={'Patient_1': {'n':[1, nan, 3, 4], 't': [5,6,7,8]},
'Patient_2': {'n':[9,10,11,12], 't':[14,nan,16,17]},
'Patient_3': {'n':[1.5,nan,3.5,4.5], 't':[5.5,6.5,7.5,8.5]}}
Run Code Online (Sandbox Code Playgroud)
对于每个患者,我希望有一组两个并排的小提琴图,一个'n'和一个用于't'. 我希望所有六个小提琴图都在同一个图上,共享 y 轴。
我正在尝试使用matplotlib violinplot,但我不确定如何在'dataset'选项中输入我的字典,也不知道如何按患者对'n'和进行分组't'。
任何帮助将不胜感激!
我怎么能做出这样的小提琴人物呢?我想包括置信区间
我可以使用下面的代码用四边形绘制分割图,但不能绘制均值和置信度。数据可以在这里找到。https://drive.google.com/file/d/18GrncA2GmJd38tVGZZ5yylR6Cf61XsGp/view?usp=sharing
import matplotlib.pyplot as plt
import seaborn as sns
sns.violinplot(x="six.categories", y="non_poor", hue="year", data=df, split=True,
inner="quart", palette={"2019": "b", "2020": "y"})
sns.despine(left=True)
plt.xticks(np.arange(6),["Nonpoor\nWhite", "Poor\nWhite", "Poor\nBlack", "Nonpoor\nBlack", "Poor\nHispanic", "Nonpoor\nHispanic"])
Run Code Online (Sandbox Code Playgroud) pythonplotly小提琴图显示负尾,但没有低于0的值。实际y轴在0到23之间(24小时间隔)。但小提琴图尾部超过 23 且小于 0(第 0 和第 23 边距级别添加到图表中)。
代码:
fig = go.Figure()
fig.add_trace(go.Violin(x=df['Region'][ df['alarm_severity'] == 'CRITICAL' ],
y=df['OccurredTime'][ df['alarm_severity'] == 'CRITICAL' ],
legendgroup='CRITICAL', scalegroup='CRITICAL', name='CRITICAL',
line_color='blue')
)
fig.add_trace(go.Violin(x=df['Region'][ df['alarm_severity'] == 'MAJOR' ],
y=df['OccurredTime'][ df['alarm_severity'] == 'MAJOR' ],
legendgroup='MAJOR', scalegroup='MAJOR', name='MAJOR',
line_color='red')
)
fig.add_trace(go.Violin(x=df['Region'][ df['alarm_severity'] == 'WARNING' ],
y=df['OccurredTime'][ df['alarm_severity'] == 'WARNING' ],
legendgroup='WARNING', scalegroup='WARNING', name='WARNING',
line_color='green')
)
fig.add_trace(go.Violin(x=df['Region'][ df['alarm_severity'] == 'MINOR' ],
y=df['OccurredTime'][ df['alarm_severity'] == 'MINOR' ],
legendgroup='MINOR', scalegroup='MINOR', name='MINOR',
line_color='orange')
)
fig.update_traces(box_visible=True, meanline_visible=True )
fig.update_layout(violinmode='group',width=1000,
height=600)
fig.show()
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用seaborn中的分割小提琴图来绘制具有不同范围的两个变量。
这是我到目前为止所做的:
from matplotlib import pyplot as plt
import seaborn as sns
import numpy as np
df1 = pd.read_csv('dummy_metric1.csv')
df2 = pd.read_csv('dummy_metric2.csv')
fig, ax2 = plt.subplots()
sns.set_style('white')
palette1 = 'Set2'
palette2 = 'Set1'
colors_list = ['#78C850', '#F08030', '#6890F0', '#A8B820', '#F8D030', '#E0C068', '#C03028', '#F85888', '#98D8D8']
ax1 = sns.violinplot(y=df1.Value,x=df1.modality,hue=df1.metric, palette=palette1, inner="stick")
xlim = ax1.get_xlim()
ylim = ax1.get_ylim()
for violin in ax1.collections:
bbox = violin.get_paths()[0].get_extents()
x0, y0, width, height = bbox.bounds
violin.set_clip_path(plt.Rectangle((x0, y0), width / 2, height, transform=ax1.transData))
ax1.set_xlim(xlim)
ax1.set_ylim(ylim)
ax1.set_title("dummy")
ax1.set_ylabel("metric1")
ax1.set_xlabel("Modality") …Run Code Online (Sandbox Code Playgroud) 我目前有以下情节:

问题是,由于短期小提琴图约为 -0.1,长期小提琴图约为 -0.5,因此图表的可读性远远低于应有的水平。因此,我想创建第二个 y 轴,连接到短期小提琴图。
我想使用两个不同的 y 轴创建小提琴图,同时在 x 轴上为多个标签绘制多个小提琴图。
我正在尝试创建一个小提琴情节。具体来说,对于 3 个不同的风险组,我想分别绘制长期和短期弹性的小提琴图(总共 6 个小提琴)。由于长期弹性与短期弹性的数量级不同,因此我想对长期和短期使用不同的 y 尺度。
这是我到目前为止所想到的:
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
np.random.seed(50)
# generate some random data
data1 = pd.DataFrame(np.random.normal(loc=0, scale=1, size=1000), columns=['Value'])
data2 = pd.DataFrame(np.random.normal(loc=5, scale=0.1, size=100), columns=['Value'])
data3 = pd.DataFrame(np.random.normal(loc=1, scale=1, size=1000), columns=['Value'])
data4 = pd.DataFrame(np.random.normal(loc=1, scale=0.1, size=100), columns=['Value'])
data5 = pd.DataFrame(np.random.normal(loc=2, scale=1, size=1000), columns=['Value'])
data6 = pd.DataFrame(np.random.normal(loc=2, scale=0.1, size=100), columns=['Value'])
# create the …Run Code Online (Sandbox Code Playgroud) 我正在创建一些小提琴图并想给它们上色。它适用于 9 维矩阵,如我之前的问题所示
但是当我将维度增加到 15 时,颜色的顺序就不受尊重了。为什么会发生这种情况?
它在这里工作(9 列):
library(ggplot2)
dat <- matrix(rnorm(250*9),ncol=9)
# Violin plots for columns
mat <- reshape2::melt(data.frame(dat), id.vars = NULL)
mat$variable_grouping <- as.character(sort(rep(1:9,250)))
pp <- ggplot(mat, aes(x = variable, y = value, fill = variable_grouping)) +
geom_violin(scale="width",adjust = 1,width = 0.5) + scale_fill_manual(values=rep(c("red","green","blue"),3))
pp
Run Code Online (Sandbox Code Playgroud)
这里不起作用(15 列):
library(ggplot2)
dat <- matrix(rnorm(250*15),ncol=15)
# Violin plots for columns
mat <- reshape2::melt(data.frame(dat), id.vars = NULL)
mat$variable_grouping <- as.character(sort(rep(1:15,250)))
pp <- ggplot(mat, aes(x = variable, y = value, fill = variable_grouping)) …Run Code Online (Sandbox Code Playgroud) 我使用 ggplot 创建了这些半小提琴图。但是,我不想包含显示中位数的箱线图,而是包含一条带有平均值的水平线。这意味着每个彩色一半都有自己的平均线:金色一半的平均线不会与灰色一半的平均线完全对齐。重要的是,我希望平均线仅位于密度图中。我怎样才能实现这个目标?我无法弄清楚,我将不胜感激任何帮助!
以下是一些示例数据:
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)
这是 geom_violin 的扩展,用于创建 split_geom_violin:
GeomSplitViolin <- ggproto("GeomSplitViolin", GeomViolin, draw_group = function(self, data, ..., draw_quantiles = NULL){
data <- transform(data, xminv = x - violinwidth * (x - xmin), xmaxv = x + violinwidth * (xmax - x))
grp <- data[1,'group']
newdata <- plyr::arrange(transform(data, x = if(grp%%2==1) xminv else xmaxv), if(grp%%2==1) y else -y)
newdata …Run Code Online (Sandbox Code Playgroud) violin-plot ×10
python ×8
seaborn ×6
matplotlib ×5
ggplot2 ×2
plotly ×2
r ×2
boxplot ×1
colormap ×1
dictionary ×1