python绘制云雨图raincloud plot


Posted in Python onAugust 05, 2022

官方github: https://github.com/RainCloudPlots/RainCloudPlots

Raincloud 的 Python 实现是一个名为 PtitPrince 的包,它写在 seaborn 之上,这是一个 Python 绘图库,用于从 pandas 数据帧中获取漂亮的绘图。

import pandas as pd
import seaborn as sns
import os
import matplotlib.pyplot as plt
#sns.set(style="darkgrid")
#sns.set(style="whitegrid")
#sns.set_style("white")
sns.set(style="whitegrid",font_scale=2)
import matplotlib.collections as clt
import ptitprince as pt
#图片保存及输出设置
savefigs = True
figs_dir = '../figs/tutorial_python'
if savefigs:
    # Make the figures folder if it doesn't yet exist
    #如果没有找到文件夹,先创建此文件夹
    if not os.path.isdir('../figs/tutorial_python'):
        os.makedirs('../figs/tutorial_python')

def export_fig(axis,text, fname):
    if savefigs:
        axis.text()
        axis.savefig(fname, bbox_inches='tight')
df = pd.read_csv ("simdat.csv", sep= ",")
df.head()

python绘制云雨图raincloud plot

该图可以让读者初步了解数据集:哪个组的平均值更大,这种差异是否可能显着。 此图中仅显示每组分数的平均值和标准差。

f, ax = plt.subplots(figsize=(7, 7))
sns.barplot(x = "group", y = "score", data = df, capsize= .1)
plt.title("Figure P1\n Bar Plot")
if savefigs:
    plt.savefig('.\\figs\\tutorial_python\\figureP01.png', bbox_inches='tight')

python绘制云雨图raincloud plot

为了了解我们的数据集的分布,我们可以绘制一个“云”,即直方图的平滑版本:

# plotting the clouds
f, ax = plt.subplots(figsize=(7, 5))
dy="group" 
dx="score"
ort="h"
pal = sns.color_palette(n_colors=1)
ax=pt.half_violinplot(x=dx, y=dy, data=df, palette=pal, bw=.2, cut=0., scale="area", width=.6, inner=None, orient=ort)
plt.title("Figure P2\n Basic Rainclouds")
if savefigs:
    plt.savefig('.\\figs\\tutorial_python\\figureP02.png', bbox_inches='tight')

python绘制云雨图raincloud plot

为了更精确地了解分布并说明数据中的潜在异常值或其他模式,我们现在添加“雨”,即数据点的简单单维表示:

# adding the rain
f, ax=plt.subplots(figsize=(7, 5))
ax=pt.half_violinplot(x=dx, y=dy, data=df, palette=pal, bw=.2, cut=0., scale="area", width=.6, inner=None, orient=ort)
ax=sns.stripplot(x=dx, y=dy, data=df, palette=pal, edgecolor="white", size=3, jitter=0, zorder=0, orient=ort)
plt.title("Figure P3\n Raincloud Without Jitter")
if savefigs:
    plt.savefig('.\\figs\\tutorial_python\\figureP03.png', bbox_inches='tight')

python绘制云雨图raincloud plot

# adding jitter to the rain
f, ax =plt.subplots(figsize=(7, 5))
ax=pt.half_violinplot(x=dx, y=dy, data=df, palette=pal, bw=.2, cut=0., scale="area", width=.6, inner=None, orient=ort)
ax=sns.stripplot(x=dx, y=dy, data=df, palette=pal, edgecolor="white", size=3, jitter=1, zorder=0, orient=ort)
plt.title("Figure P4\n Raincloud with Jittered Data")
if savefigs:
    plt.savefig('.\\figs\\tutorial_python\\figureP04.png', bbox_inches='tight')

python绘制云雨图raincloud plot

这样可以很好地了解数据点的分布情况,但中位数和四分位数并不明显,很难一目了然地确定统计差异。 因此,我们添加了一个“空”箱线图来显示中位数、四分位数和异常值:

#adding the boxplot with quartiles
f, ax=plt.subplots(figsize=(7, 5))
ax=pt.half_violinplot(x=dx, y=dy, data=df, palette=pal, bw=.2, cut=0.,
                      scale="area", width=.6, inner=None, orient=ort)
ax=sns.stripplot(x=dx, y=dy, data=df, palette=pal, edgecolor="white",
                 size=3, jitter=1, zorder=0, orient=ort)
ax=sns.boxplot(x=dx, y=dy, data=df, color="black", width=.15, zorder=10,
               showcaps=True, boxprops={'facecolor':'none',"zorder":10},
               showfliers=True, whiskerprops{'linewidth':2,"zorder":10},
               saturation=1, orient=ort)
plt.title("Figure P5\n Raincloud with Boxplot")
if savefigs:
    plt.savefig('../figs/tutorial_python/figureP05.png', bbox_inches='tight')

python绘制云雨图raincloud plot

现在我们可以设置一个调色板来表征两组:

#adding color
pal="Set2"
f, ax=plt.subplots(figsize=(7, 5))
ax=pt.half_violinplot(x=dx, y=dy, data=df, palette=pal, bw=.2, cut=0.,
                      scale="area", width=.6, inner=None, orient=ort)
ax=sns.stripplot(x=dx, y=dy, data=df, palette=pal, edgecolor="white",
                 size=3, jitter=1, zorder=0, orient=ort)
ax=sns.boxplot(x=dx, y=dy, data=df, color="black", width=.15, zorder=10,
              showcaps=True, boxprops={'facecolor':'none',"zorder":10},
              showfliers=True, whiskerprops={'linewidth':2,"zorder":10},
              saturation=1, orient=ort)
plt.title("Figure P6\n Tweaking the Colour of Your Raincloud")

python绘制云雨图raincloud plot

我们可以使用函数 pt.Raincloud 来添加一些自动化:

#same thing with a single command: now x **must** be the categorical value
dx="group"; dy="score"; ort="h"; pal="Set2"; sigma=.2
f, ax=plt.subplots(figsize=(7, 5))
pt.RainCloud(x=dx, y=dy, data=df, palette=pal, bw=sigma,
             width_viol = .6, ax = ax, orient = ort)
plt.title("Figure P7\n Using the pt.Raincloud function")
if savefigs:
    plt.savefig('../figs/tutorial_python/figureP07.png', bbox_inches='tight')

python绘制云雨图raincloud plot

‘move’ 参数可用于移动箱线图下方的雨量,在某些情况下提供更好的原始数据可见性:

#moving the rain below the boxplot
dx="group"; dy="score"; ort="h"; pal="Set2"; sigma=.2
f,ax=plt.subplots(figsize=(7, 5))
ax=pt.RainCloud(x=dx, y=dy, data=df, palette=pal, bw=sigma,
                 width_viol=.6, ax=ax, orient=ort, move=.2)
plt.title("Figure P8\n Rainclouds with Shifted Rain")

python绘制云雨图raincloud plot

此外,raincloud 函数同样适用于列表或 np.array,如果您更喜欢使用它们而不是数据框输入:

# Usage with a list/np.array input
dx=list(df["group"]); dy=list(df["score"])
f, ax=plt.subplots(figsize=(7, 5))
ax=pt.RainCloud(x=dx, y=dy, palette=pal, bw=sigma,
                 width_viol=.6, ax=ax, orient=ort)
plt.title("Figure P9\n Rainclouds with List/Array Inputs")

python绘制云雨图raincloud plot

对于某些数据,您可能希望将雨云的方向翻转为“petit prince”图。 您可以使用 pt.RainCloud 函数中的 ‘orient’ 标志来执行此操作:

# Changing orientation
dx="group"; dy="score"; ort="v"; pal="Set2"; sigma=.2
f, ax=plt.subplots(figsize=(7, 5))
ax=pt.RainCloud(x=dx, y=dy, data=df, palette=pal, bw=sigma,
                 width_viol=.5, ax=ax, orient=ort)
plt.title("Figure P10\n Flipping your Rainclouds")

python绘制云雨图raincloud plot

还可以更改用于生成数据概率分布函数的平滑核。 为此,您调整 sigma 参数:

#changing cloud smoothness
dx="group"; dy="score"; ort="h"; pal="Set2"; sigma=.05
f, ax=plt.subplots(figsize=(7, 5))
ax=pt.RainCloud(x=dx, y=dy, data=df, palette=pal, bw=sigma,
                 width_viol=.6, ax=ax, orient=ort)
plt.title("Figure P11\n Customizing Raincloud Smoothness")

python绘制云雨图raincloud plot

最后,使用 pointplot 标志,您可以添加一条连接组平均值的线。 这对于更复杂的数据集很有用,例如重复测量或因子数据。 下面我们通过改变各个图的色调、不透明度或闪避元素来说明使用雨云绘制此类数据的几种不同方法:

#adding a red line connecting the groups' mean value (useful for longitudinal data)
dx="group"; dy="score"; ort="h"; pal="Set2"; sigma=.2
f, ax=plt.subplots(figsize=(7, 5))
ax=pt.RainCloud(x=dx, y=dy, data=df, palette=pal, bw=sigma,
                 width_viol=.6, ax=ax, orient=ort, pointplot=True)
plt.title("Figure P12\n Adding Lineplots to Emphasize Factorial Effects")

python绘制云雨图raincloud plot

另一个灵活的选择是使用 Facet Grids 来分隔不同的组或因子水平,

如下所示:

# Rainclouds with FacetGrid
g=sns.FacetGrid(df, col="gr2", height=6)
g=g.map_dataframe(pt.RainCloud, x="group", y="score", data=df, orient="h")
g.fig.subplots_adjust(top=0.75)
g.fig.suptitle("Figure P13\n Using FacetGrid for More Complex Designs",  fontsize=26)

python绘制云雨图raincloud plot

作为一种替代方法,可以使用色调输入将不同的子组直接绘制在彼此之上,从而促进它们的比较:

# Hue Input for Subgroups
dx="group"; dy="score"; dhue="gr2"; ort="h"; pal="Set2"; sigma=.2
f, ax=plt.subplots(figsize=(12, 5))
ax=pt.RainCloud(x=dx, y=dy, hue=dhue, data=df, palette=pal, bw=sigma,
                 width_viol=.7, ax=ax, orient=ort)
plt.title("Figure P14\n Rainclouds with Subgroups")

python绘制云雨图raincloud plot

为了提高该图的可读性,我们使用相关标志(0-1 alpha 强度)调整 alpha 级别:

# Setting alpha level
f, ax=plt.subplots(figsize=(12, 5))
ax=pt.RainCloud(x=dx, y=dy, hue=dhue, data=df, palette=pal, bw=sigma,
                 width_viol=.7, ax=ax, orient=ort , alpha=.65)
plt.title("Figure P15\n Adjusting Raincloud Alpha Level")

python绘制云雨图raincloud plot

我们可以将 dodge 标志设置为 true,而不是让两个箱线图相互混淆,从而增加交互性:

#The Doge Flag
f, ax=plt.subplots(figsize=(12, 5))
ax=pt.RainCloud(x=dx, y=dy, hue=dhue, data=df, palette=pal, bw=sigma,
                 width_viol=.7, ax=ax, orient=ort , alpha=.65, dodge=True)
plt.title("Figure P16\n The Boxplot Dodge Flag")

python绘制云雨图raincloud plot

最后,我们可能希望在我们的图表中添加一个传统的线图,以帮助检测因子主效应和交互作用。

例如,我们在每个箱线图中绘制了平均值:

#same, with dodging and line
f, ax=plt.subplots(figsize=(12, 5))
ax=pt.RainCloud(x=dx, y=dy, hue=dhue, data=df, palette=pal, bw=sigma, 
                width_viol=.7, ax=ax, orient=ort , alpha=.65, 
                dodge=True, pointplot=True)
plt.title("Figure P17\n Dodged Boxplots with Lineplots")

python绘制云雨图raincloud plot

这是相同的图,但现在使用“移动”参数再次将单个观测值移动到箱线图下方:

#moving the rain under the boxplot
f, ax=plt.subplots(figsize=(12, 5))
ax=pt.RainCloud(x=dx, y=dy, hue=dhue, data=df, palette=pal, bw=sigma, 
               width_viol=.7, ax=ax, orient=ort , alpha=.65, dodge=True, 
               pointplot=True, move=.2)
plt.title("Figure P18\n Shifting the Rain with the Move Parameter")

python绘制云雨图raincloud plot

作为我们的最后一个示例,我们将考虑具有两组和三个时间点的复杂重复测量设计。 目标是说明我们复杂的相互作用和主要影响,同时保持雨云图的透明性:

# Load in the repeated data
df_rep=pd.read_csv("repeated_measures_data.csv", sep=",")
df_rep.columns=["score",  "timepoint", "group"]
df_rep.head()

python绘制云雨图raincloud plot

# Plot the repeated measures data
dx="group"; dy="score"; dhue="timepoint"; ort="h"; pal="Set2"; sigma=.2
f, ax=plt.subplots(figsize=(12, 5))
ax=pt.RainCloud(x=dx, y=dy, hue=dhue, data=df_rep, palette=pal, bw=sigma, width_viol=.7,
               ax=ax, orient=ort , alpha=.65, dodge=True, pointplot=True, move=.2)
plt.title("Figure P19\n Repeated Measures Data - Example 1")

python绘制云雨图raincloud plot

# Now with the group as hue
dx="timepoint"; dy="score"; dhue="group"
f, ax=plt.subplots(figsize=(12, 5))
ax=pt.RainCloud(x=dx, y=dy, hue=dhue, data=df_rep, palette=pal, bw=sigma, width_viol=.7,
                ax=ax, orient=ort , alpha=.65, dodge=True, pointplot=True, move=.2)
plt.title("Figure P20\n  Repeated Measures Data - Example 2")

python绘制云雨图raincloud plot

到此这篇关于python绘制云雨图raincloud plot的文章就介绍到这了,更多相关python绘制云雨图内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python切片用法实例教程
Sep 08 Python
在Python程序中实现分布式进程的教程
Apr 28 Python
举例讲解Python的Tornado框架实现数据可视化的教程
May 02 Python
初步讲解Python中的元组概念
May 21 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
python3对拉勾数据进行可视化分析的方法详解
Apr 03 Python
Python绘图Matplotlib之坐标轴及刻度总结
Jun 28 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
Python Numpy中数据的常用保存与读取方法
Apr 01 Python
学python最电脑配置有要求么
Jul 05 Python
python Cartopy的基础使用详解
Nov 01 Python
python实战之一步一步教你绘制小猪佩奇
Apr 22 Python
python计算列表元素与乘积详情
Aug 05 #Python
Pygame游戏开发之太空射击实战敌人精灵篇
Aug 05 #Python
python playwrigh框架入门安装使用
Jul 23 #Python
python playwright之元素定位示例详解
Jul 23 #Python
Sentry的安装、配置、使用教程(Sentry日志手机系统)
Jul 23 #Python
Python中的 No Module named ***问题及解决
Jul 23 #Python
利用Python脚本写端口扫描器socket,python-nmap
Jul 23 #Python
You might like
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
PHP脚本的10个技巧(1)
2006/10/09 PHP
PHP中用header图片地址 简单隐藏图片源地址
2008/04/09 PHP
用穿越火线快速入门php面向对象
2012/02/22 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
php正确输出json数据的实例讲解
2018/08/21 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
深入分析element ScrollBar滚动组件源码
2019/01/22 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
详解Vue的七种传值方式
2021/02/08 Vue.js
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
Python多线程编程(五):死锁的形成
2015/04/05 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
基于pandas中expand的作用详解
2019/12/17 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
使用python matplotlib 画图导入到word中如何保证分辨率
2020/04/16 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
HTML5实现表单自动验证功能实例代码
2017/01/11 HTML / CSS
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
实习自我鉴定范文
2013/10/30 职场文书
机电一体化职业规划书
2014/01/07 职场文书
药品采购员岗位职责
2014/02/08 职场文书
班级文化建设标语
2014/06/23 职场文书
学生违反校规检讨书
2014/10/28 职场文书
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL