在 plotly express violin plot 中将 x 轴视为分类

Posted

技术标签:

【中文标题】在 plotly express violin plot 中将 x 轴视为分类【英文标题】:Treat x axis as categorical in plotly express violin plot 【发布时间】:2021-12-23 04:20:44 【问题描述】:

我有一个数据集 df[type, x, y] - [96 rows x 3 columns]。 x 有 4 个唯一值:(0. 0.322, 1.89, 3.460)

这是一个示例:

print (df.groupby('x').apply(lambda df: df.sample(4)))

OUT: 
         type      x     y
x                         
0.000 5     2  0.000  1123
      6     2  0.000  1178
      7     2  0.000   850
      3     1  0.000   515
0.322 72    1  0.322   174
      42    1  0.322   182
      79    2  0.322   450
      10    1  0.322   340
1.890 54    2  1.890   140
      71    2  1.890   126
      80    1  1.890    61
      19    1  1.890    60
3.460 30    2  3.460   120
      88    1  3.460    35
      26    1  3.460    40
      92    2  3.460    98

我正在使用 plotly express 来制作 小提琴图,但是由于 我的 x 值间隔不均匀,它是 >拉伸我的 x 轴 导致难以阅读:

fig = px.violin(df, y="y", x="x", color="type", box=True, violinmode='overlay',points="all", 
          hover_data=df.columns)
fig.show()

Plotly express 有没有办法将 x 轴视为分类 - 所以不要拉伸它?

【问题讨论】:

将 x 转换为字符串? 我尝试使用 df["x"] = df["x"].astype("str") 并且我的类型是:type object x object y int64 dtype: object.但是图表是一样的。 【参考方案1】:

您可以将 xaxes 设置为分类:

fig.update_xaxes(type='category')

例如,我创建了一个与您非常相似的 DataFrame,其中 x 列也是数字,现在 Plotly 将在绘图时将其解释为分类,每个唯一 x 值之间的间距均匀:

import numpy as np
import pandas as pd
import plotly.express as px

## create some data similar to yours with 80 rows
np.random.seed(42)
values = np.random.randint(30,size=80)
df = pd.DataFrame(
    'x':[0,0.322,1.89,3.46]*20,
    'y':np.random.randint(30,size=80),
    'type':[1]*40 + [2]*40
 )

fig = px.violin(df, y="y", x="x", color="type", box=True, violinmode='overlay',points="all",hover_data=df.columns)
fig.update_xaxes(type='category')
fig.show()

【讨论】:

此解决方案确实会删除额外的刻度,但不会压缩它。我希望忽略不同 x 值之间的数值距离,以便所有内容均匀分布且可读 是否将 x 的列类型更改为字符串,然后传递 tickvals = ['0.0', '0.322', '1.89', '3.460'] 工作? 我试过了,但它仍然无法将它们解释为数字。 好的,我想我有更好的工作解决方案! 太棒了,谢谢!【参考方案2】:

我找到了一个好的解决方法

我在 df["x"] 中添加了一个“-”字符

df["x"]=df['x'].astype(str) + "-"
fig = px.violin(df, y="y", x="x", color="type", box=True, violinmode='overlay',points="all", 
              hover_data=df.columns)

fig.show()

仅仅添加一个空格“”是行不通的。

如果有人有更好的解决方案,请发布。

【讨论】:

以上是关于在 plotly express violin plot 中将 x 轴视为分类的主要内容,如果未能解决你的问题,请参考以下文章

R语言plotly可视化:plotly可视化基础小提琴图(basic violin plot in R with plotly)

R语言plotly可视化:plotly可视化分组(grouped)小提琴图(grouped violin plot in R with plotly)

R语言plotly可视化:plotly可视化多分类变量小提琴图(multiple variable violin plot in R with plotly)

R语言ggplot2可视化:可视化分组的小提琴图(violin plot)并在分组小提琴内部嵌入箱图(box plot)

seaborn使用Catplot函数可视化水平小提琴图(Make Horizontal Violin Plot with Catplot in Seaborn)

R语言ggplot2可视化小提琴图(violin plot)并使用ggsignif添加分组显著性(significance)标签