图片缩略图

gramm(完整的数据可视化工具箱,ggplot2/R-like)

版本2.25 (2.21 MB) 皮埃尔·莫雷尔
快速创建出版质量的图:自动颜色和子图,统计数据,小提琴/箱形图等。
5.0
77年评级

151下载

更新2020年5月31日

从GitHub

查看版本历史

在GitHub上查看许可证

编者按:此文件被选为MATLAB Central本周精选

Gramm是一个强大的绘图工具箱,它允许在Matlab中快速创建复杂的,出版质量的图形,并受到R的ggplot2库的启发。作为这个灵感的参考,gramm代表Matlab的图形语法。
github自述文件上的用例和示例截图:
https://github.com/piermorel/gramm

如需快速帮助,请使用小抄:
https://github.com/piermorel/gramm/raw/master/gramm%20cheat%20sheet.pdf

引用格拉姆:
莫雷尔,(2018)。Gramm: Matlab中绘图的语法。开源软件学报,3(23),568,https://doi.org/10.21105/joss.00568

工作流程:
使用gramm生成图形的典型工作流如下所示(插图中的示例图形使用6行代码生成):

-在第一步中,为gramm提供图形的相关数据:X和Y变量,但还要分组变量,以确定颜色,subplot行/列等。

-在接下来的步骤中,向您的图形添加图形层:原始数据层(直接将数据绘制为点,线…)或统计层(绘图拟合,直方图,密度,具有置信区间的摘要…)一条指令足以添加每一层,并且所有层都提供许多自定义选项。

在最后一步,gramm绘制图形,并处理所有烦人的部分:不需要循环颜色或子图,颜色和图例自动生成,轴限制被照顾,等等。

特点:
-接受X,Y和Z数据作为数组,矩阵或数组的单元格
-接受分组数据为数组或cellstr。Gramm最适合处理类似表格的数据:对感兴趣的变量进行单独的变量/字段/列,每个变量具有与观察值相同的元素。

—多种数据分组分离方式:
-颜色,明度,点标记,线条样式和点/线条大小(“颜色”,“明度”,“标记”,“线条样式”,“大小”)
-行和/或列,或包装列(facet_grid()和facet_wrap())的子图。多个选项的一致轴限制跨面,行,列等(使用“规模”和“空间”)。

-多种直接绘制数据的方法:
-散射图(geom_point())和抖动散点图(geom_jitter())
- lines (geom_line())
-置信区间(geom_interval())
- bars plots (geom_bar())
-栅格图(geom_raster())
-点计数(point_count())

-多种方法绘制数据的统计可视化:
由x个值(唯一值或二进制值)汇总的y个数据,具有置信区间(stat_summary())
- x值的直方图和密度图(stat_bin()和stat_density())
- x-y差异直方图(stat_cornerhist())
-盒和须图(stat_boxplot())
-小提琴图(stat_violin())
- x数据分布与理论分布或y数据分布的分位数-分位数图(stat_qq())。
-样条平滑数据与可选的置信区间(stat_smooth())
-带等高线或热图输出的2D分箱(stat_bin2d())
- GLM fits (stat_glm(),需要统计工具箱)
-自定义适合用户提供的匿名函数(stat_fit(),需要曲线拟合工具箱)
-信心椭圆(stat_ellipse())

-子情节创建之间没有太多的空白(和调整适当的大小!)
-极坐标(set_polar())
当使用geom_point()或geom_line()时,'z'输入数据在gramm()创建3D绘图
颜色数据也可以显示为连续变量,而不是分组因子(set_continuous_color())
X轴和Y轴可以翻转以获得水平统计可视化(coord_flip())
颜色生成可以在LCH颜色空间中自定义,或者可以使用替代/自定义颜色映射(set_color_options())
标记的形状和大小可以使用set_point_options()自定义
线条样式和宽度可以使用set_line_options()自定义
-文本元素方面可以使用set_text_options()自定义
-置信区间为阴影区域,错误条或细线
-在geom_ functions、stat_bin()、stat_summary()和stat_boxplot()中设置图形元素的宽度和闪避,使用'width'和'dodge'参数
-成员结构结果包含了stat_绘图的计算结果以及所有绘图元素的图形句柄
-全局标题(set_title)
-通过创建一个gram对象的矩阵并在整个矩阵上调用draw()方法,可以将多个gram图组合在同一个图形中。可以通过在整个矩阵上调用set_title来添加总体标题。
使用update()方法可以对不同的stat_和geom_层使用不同的分组
- Matlab轴的属性可以通过axe_property方法访问
-使用set_names自定义图例标签
—使用geom_abline、geom_vline、geom_hline和geom_polygon在Plot上引用Plot元素
-使用set_datetick标记日期
-使用set_parent()绘制特定的图形或uipanel/uitab

引用作为

莫雷尔,皮埃尔。Gramm: Matlab中绘图语法开源软件杂志,第3卷,第3期。23、《中国经济》,2018年3月,p. 568, doi:10.21105/joss.00568。

查看更多样式

意见及评分(111

Roey Zuitlin

优秀的工具。是否可以在同一个图形上绘制box_plot和geom_point,但它们的颜色不同?

babak naghizadehsafa

非常好的包装!节省时间。但是,我有一个问题使用set_polar()函数。
我想使用字母轴标签,这在笛卡尔坐标风格中工作得很好,但当我使用set_polar()时,它切换为数值。任何想法吗?
g(1,1) =格拉姆(“x”,cellstr (M_sum.region_id)、“y”,abs (M_sum.M_strain_axial)……
“颜色”,M_sum.cycle_id“子集”,~比较字符串(cellstr (M_sum.region_id),“na”));
g (1,1) .stat_summary(“几何学”、“点”、“类型”、“词”,“插值函数”,“极”,“setylim”,“真正的”);
g (1,1) .set_names(“标签”,cellstr (M_sum.region_id))
% g (1,1) .set_polar(“关闭”,真的)
g (1,1) .set_title(“应用程序。泊松”年代比)
g (1,1) .no_legend ();

Zafb

非常棒的提交。
我只是想知道是否有一种方法显示平均值+- Std开发。在“stat_summary”方法?显然,可用选项的95% CI是不一样的。我们经常需要使用Std. Dev绘制错误条。

JONGHA吸引

Eric任

嗨,干得真不错!但是我遇到了一些麻烦。xtick标签顺序将自动更改,我如何自定义标签顺序?谢谢!

amo铲

亚伦切断

嗨,我有一个问题使用应用程序设计器的语法。我想在app。uiaxes上显示gramm图形。我该怎么做呢?

Mohsen Mazrooyi

你好。这是非常酷的包装!但是我对X Tick有一个问题!X刻度改变我的刻度的顺序字母。我想将X标记重新排序到输入标签的相同顺序。你能帮我一下吗?

亚历克西斯穆帅

谢谢,干得好!

ishak abdi

伟大的包,是否可以使用geom_point()为一组和geom_line()为另一组,例如,我必须散射图观测与模拟,我想用geom_line()绘制一条线,完美适合误差带为15%,然后使用geom_point()为观测值。请问我该怎么做呢?

ishak abdi

谢谢,这是一个非常方便的工具,可以以非常可控和清晰的方式绘制数据!

小虎朱

我正在尝试绘制一个生物医学信号,我想用一种颜色表示与“激活”时间对应的信号样本,用另一种颜色表示与“静止”时间对应的信号样本。我尝试了几种变通办法,但似乎还是遇到了同样的问题。也就是说,当使用geom_line()时,自动划线发生在两个“休息”块之间。我或多或少尝试了以下方法:

activation_times;rest_times;%向量,包含x值,分别对应于激活/休息时间
activation_signal;rest_signal;包含相应激活/休息时间的振幅的%向量

X = [activation_times rest_times];
Y = [activation_signal];

%设置分组变量
G = 0 (size(X,2));G(1:长度(activation_times)) = 1;

g(1,1) = gram ('x', x,'y', y,'color', g);
g (1,1) .geom_line ();

图();
g.draw ();

感谢您的帮助和建议!

非常感谢Pierre,这个工具箱真的很有帮助,我知道它会节省我很多时间:)

在用Gramm创建的图中包含p值的最佳方法是什么?例如,在箱线图上表示不同组间的统计学意义。

再次感谢!

尼尔·梅森

@Pierre,同时使用R2017b和R2019b,我找不到例子。M来跑。我已经按照说明书中的说明做了。md用于将文件夹路径添加到我的环境中,并且我可以清楚地调用gramm。错误如下:

> >的例子
未定义变量“GeneralizedLinearModel”或类“GeneralizedLinearModel.fit”。

gramm/stat_glm>my_glm错误(第39行)
mdl = GeneralizedLinearModel.fit(combx,comby,'Distribution',params.distribution);

gramm/stat_glm>@(dobj,dd)my_glm(dobj,dd,p.Results)中的错误(第27行)
{@ obj.geom = vertcat (obj.geom (dobj dd) my_glm (dobj, dd, p.Results)});

克/画错误(第548行)
obj.geom {geom_ind} (obj draw_data);

示例中的错误(第35行)
g.draw ();

你能帮忙吗?谢谢!

Stephen Folmer

Wee-Lih李

刘钟旭

非常感谢你的优秀工具!!我只是想知道我们是否可以手动设置每个地块的ylim。

马吕斯克鲁格

黎元洪

进一步我之前的评论,我发现set_parent方法,然而,试图使用GUI布局工具箱容器作为父导致非常奇怪的行为和很多警告。是否有一种方法可以同时使用这些工具箱?

z8080

zipeng张

Ashwin克里希南

威孚

这应该包括在官方发布!

皮埃尔·莫雷尔

@Fanny
这种类型的问题通常发生在gramm安装不当或路径被更改的情况下。请确保您遵循README的步骤。

范妮拉

你好,皮埃尔,

谢谢你的工具箱。
如果你还没读过这个:
我试着用gramm,但我有这个错误

---------------------------------------------------------
使用gramm/set_names时出错
方法“set_names”没有为类“gramm”定义,或者从MATLAB的搜索路径中删除。

克错误(第182行)
set_names (obj);
--------------------------
我该怎么办??
--------------------------
运行不带参数的set_xx_options()函数
%的违约
LINE 182 = set_names(obj);
set_continuous_color (obj,“活跃”,南);
set_order_options (obj);
set_color_options (obj);
set_text_options (obj);
set_line_options (obj);
set_point_options (obj);
set_stat_options (obj);
set_layout_options (obj);

@james
通过使用g.金宝appaxe_property()设置相应的Matlab轴属性,gramm支持其轴上的对数刻度。在你的例子中,g.axe_property('YScale','log')。但是,请记住,所有的stat_函数都在线性空间中继续工作。

詹姆斯

可以画出半对数吗?
我尝试了ggplot语法:+ scale_y_continuous(formatter='log10')
和g.scale_y_continuous(格式化程序=“log10”)
谢谢

Pankhuri Saxena

kim9091

里卡多Caroco

jean - marc Bonello

@皮埃尔,

非常感谢!你们持续不断的支持令人鼓舞金宝app。

皮埃尔·莫雷尔

@Jean-Marc,
谢谢你的报告。我刚刚在最新的更新中修复了这个问题。该错误是由于set_datetick()默认使用datetick()的'keepticks'选项造成的。现在情况不再是这样了,并且可以将'keepticks'或' keepplimits '作为set_datetick()的参数。

jean - marc Bonello

你好,皮埃尔,
谢谢你的工作。不确定你是否遇到过这个bug。在绘制时间序列时,除了应用g.set_datetick外,其他操作都很正常。由于某种原因,x轴(时间)在左侧被截断了。尝试不同的数据集,得到相同的结果。如果我使用Matlab的散点绘图并应用datetick(),它可以正常工作。有什么已知的修复方法吗?

哈坎岩石

这是一个令人瞠目结舌的项目。非常感谢与社区分享。请继续维护。

豪尔赫·费利克斯

神奇的!

皮埃尔·莫雷尔

嗨@Razvan。是的,这是可以这样做后绘图,因为你可以访问每个绘制对象的句柄。所以在g。draw()调用之后你可以执行set([g。results.stat_boxplot。outliers_handle],'visible','off')

Razvan

伟大的绘图工具!
我有一个关于条形图的问题。是否有可能关闭异常值,只绘制盒状和晶须?

迈克尔·吴

罗伯•坎贝尔

可爱的!

Razvan

这太棒了!谢谢分享!

皮埃尔·莫雷尔

@Matthew Morriss: set_title()接受一个字符串参数,因此它将像你的例子中的title()一样工作。

这是一个更天真的问题。我想将变量的值添加到使用gramm制作的图的标题中。我通常会这样做title(['xxx' num2str(var))“公里”));。但是,我无法确定使用g.set_title(....)向标题添加变量的正确语法。

谢谢你的帮助!

皮埃尔·莫雷尔

@Matthew Morriss:嗨,Matthew,我目前没有计划添加六边形箱子,但如果你确实有一些现有的代码,它应该很容易添加,只需修改stat_bin2d(),我很乐意集成这些更改。你可以在GitHub上打开一个问题或拉请求,这样我们就可以研究它了!

马修·莫里斯

这是一个非常有用的包!问:您是否打算添加类似于ggplot作为热图可用的六边形分箱方法?

Mathijs考克斯

约翰

哇!我使用ggplot2和R已经有一段时间了。用MATLAB写出来太棒了!

皮埃尔·莫雷尔

@Seyyed:这在语法上还不可能,但它可能是我将来添加的一个功能(虽然实现起来很简单)。

Seyyed阿里

你好,皮埃尔,
是否有可能在一个图中有X轴或Y轴的角直方图?类似于MATLAB的scatterhist()。
谢谢

@allison:
- stat_summary()的结果可以显示为'geom','bar'的条形图,并通过'dodge'选项来实现错开。在stat_summary()的文档和示例中都有。m,主要在“在stat_summary()和stat_boxplot()中避闪和间隔图形元素的选项”一节中。
-平均值上的标签不能直接由stat_summary()完成,但有一个非常简单的解决方案,使用tables+rowfun()来计算gram之外的平均值,然后用geom_label()显示它们或任何其他文本。在例子中有这样一个例子。m, section“用geom_label()绘制文本或标记”。

Allison格兰特

是否有一种方法,要么覆盖酒吧或错开他们在stat_summary,以便具有相同的x值可以显示为一个酒吧,而不是一个点?还有一种方法,把文本标签的平均值由stat_summary?

Seyyed阿里

非常棒的包装。我已经使用MATLAB超过15年了,我一直在寻找MATLAB图形的包或原生改进。直到现在我才发现。这是一个优秀的产品,文档详尽,内容全面。只是想谢谢你设计了这个包裹

刘华远

温森森林

Liutong

太棒了!分叉的。

谢谢你,皮埃尔,现在开始工作了。
感谢。

YF沈

嗨,凯文,
谢谢你的反馈。这是你通常在Matlab中通过设置坐标轴的" CLim "属性来实现的。因此,您可以在所有的图上使用g.axe_property('CLim',[min_custom_range max_custom_range])在gram中做同样的事情。然而,这个覆盖将使传说错误。最终,我应该在set_continuous_color中创建一个创建选项,你能在GitHub上创建和发布吗?

凯文Alland

感谢创建这个包,非常有用。快速的问题,我可能错过了它,但是是否有一种方法来设置连续颜色值的限制,以便颜色映射跨越一个固定的范围,即使数据没有填充整个范围。这将有助于不同地块之间的视觉比较。

皮埃尔·莫雷尔

嗨,塞西莉亚,
谢谢你的反馈。
在辛烷值的例子中,'y'的大小确实是60 x 401, 'color'的大小是60 x 1,但我也提供了'x',它是1 x 401。确保所有三个输入都具有一致的大小。如果错误仍然存在,请在GitHub上打开一个问题。

你好,皮埃尔,
首先,我要感谢你们这么棒的包裹。
不过,我遇到了一个问题。我试图将光谱数据(ASD光谱)与响应(叶绿素浓度)可视化,但我得到了一个关于X和Y长度不相同的错误。我不明白错误的原因,因为在你的例子中,你使用了60行和401列的近红外(60x40矩阵x1)和辛烷值,这是60x 1向量。
在我的例子中,我使用的是49x 701 ASD光谱和49x1响应向量。
请assisst。
问候
塞西莉亚

皮埃尔·莫雷尔

亲爱的Elliot,已经可以使用stat_bin()(使用'normalization',' CDF '或'cumcount')和stat_density('function',' CDF ')来获得CDF估计。

艾略特

谢谢你这么好的包裹。是否可以添加一个stat_ecdf方法?

Pat和vdg,谢谢你们的问题,通常gitHub更适合,但你去吧:

帕特:
1.我最近添加了这个功能,它还没有被记录下来。你可以使用g.set_text_options('interpreter','tex')
2.当您调整窗口大小时,角直方图应自动随轴移动(示例。M部分为我工作)。但你说的是坐标轴。你可以为你的问题创建示例代码,并在github上创建一个问题吗?

vdg:
现在,密度只能用线条来表示。我将考虑添加与stat_bin相同的功能。你可以在gitHub上创建一个问题来跟踪这方面的进展。

帕特

嗨Piere,

非常感谢你这么好的包裹。
我有几个问题:

1.如何用xlabel, ylabel, title等来指定latex解释器?

2.如何在示例文件中重新定位角直方图?我注意到,当我改变轴的大小/重新定位时,角不会随着轴移动。

谢谢你!
帕特

Antonino Calapai

vdg

我试图获得透明的密度使用stat_density,这是可能的吗?我确实找到了如何处理stat_bin,但stat_density看起来更好…

奇妙的工作。谢谢你!

vdg

皮埃尔·莫雷尔

嗨,旧金山,

我确实明白为什么您想要提供两个独立的连续变量用于统计,但gramm是为了可视化:在图上只有一个X轴,因此所提供的X必须与Y具有相同的大小是合乎逻辑的(因此stat_glm在gramm中仅适用于每组Y = a + b X形式的方程)。此外,在某些情况下,gramm使用矩阵表示X和Y(参见examples.m)

如果希望将自定义曲线与数据拟合(在这里是二阶多项式),则可以将stat_fit与自定义匿名函数结合使用。在gramm()调用中提供X和Y,然后使用g.stat_fit('fun',@(a,b,c, X) a + b .* X + c .* X .^2)。

是否有可能,对于stat_glm,指定一个两列自变量和一个1列因变量?即使'x'中只有一列用于绘图。

我是这样做的:
g=gram ('x',[x x ^2], 'y', y, 'group', g)
并得到一个错误:数据输入有不同的长度!

谢谢!
FdC

伊凡

郝王

优秀的工作

dhaba印度

安妮Urai

迈克Shukair

伟大的图书馆……我用它进行了很多快速可视化,它大大减少了编码的数量

皮埃尔·莫雷尔

你好,

你能在github上提交一份bug报告,并包含能重现问题的最少代码吗?我无法用您在这里提供的内容重现错误:x、y和颜色未知,并且您没有指定适合stat_fit()的方程。

这段代码在R2016a中没有图形问题:
x = randn (4000 1);
y = x + randn (4000 1) / 10;
g =格拉姆(x, x, y, y);
g.geom_point ();
G.set_color_options ('map',[0.2 0.2 0.2]);
g.stat_fit(“intopt”、“观察”);
g.draw ();

如果你在窗口下,试着改变你的渲染器选项,这可能是一个Matlab错误。

E

谢谢,这是一个很棒的项目。一个有问题的bug:在R2016a上,当我在4000点上使用以下方法绘制回归图时,我得到了奇怪的竖条阴影(除了正确的阴影):
G = gram ('x', x, 'y', y);
g.set_color_options(“地图”,颜色);
g.stat_fit(“intopt”、“观察”);
g.draw ();

正义与发展党

皮埃尔·莫雷尔

嗨,阿南德,谢谢你的反馈。图例位置调整已经是一个要求的功能(见https://github.com/piermorel/gramm/issues/8为可能的解决方案),但我相信你注意到了,gramm没有使用Matlab的legend()函数…所以添加不是那么简单。目前最简单的是在导出后在矢量编辑软件中完成。

阿南德

很棒的代码,谢谢分享。我如何改变图例的位置说“南向外”,例如水平方向?

grega

皮埃尔·莫雷尔

你好,塔旺达,谢谢你的反馈。标签的公式解释器在当前版本中确实被禁用了!我可能会修复这个问题或提供一个简单的选项,但与此同时,你可以在绘制图形后使用以下代码:

集(0,“ShowHiddenHandles”,“上”)
集(findobj (gcf、“类型”、“文本”),“翻译”,“泰克斯”)

您可以使用gramm对象的句柄属性(facet_axes_handles, legend_axe_handle)进行更细粒度的控制。

Tawanda加拉

这里证明了你做得很好。如何在标签上标单位。我已经尝试了这个g.set_names('x','Canopy position','y','N cm.^2','color','Species');但无济于事。

先谢谢你

嗨,Pablo和MooMin,自定义文本字体和大小的可能性将在本周末的下一次更新中到来,同时还可能自定义线条/标记样式的顺序。

我将看看我可以为geom_/h/v/ab/line()顺序做什么。现在它们都画在最后因为这是最终轴的极限已知的时候。

很棒的工具箱,它使绘图非常直观(特别是如果您习惯了ggplot2),并且这些图形本身看起来比默认的Matlab图形要好得多。但是,正如其他用户指出的那样,这个工具箱应该包括独立更改轴标题字体大小的功能。

此外,(除非我做了不正确的事情),像geom_hline/vline这样的函数似乎总是在绘制的数据上绘制直线。在R中的ggplot2中,绘图项将按照调用它们的时间顺序进行绘制。例如,如果在geom_line之前调用geom_hline/vline,它们将出现在geom_line的乘积后面。除非我做错了什么,否则希望这个功能将集成到未来的版本中。

森林小人

我喜欢这个工具箱,它非常棒,使用起来非常简单,只有一个例外-为了改变我的图形中的轴+图例+标题的字体大小或字体名称,我被迫写一个外部函数来循环遍历图中的所有文本对象,这是冗余和混乱的。
将来是否有机会实现这样的功能?

korkam

约翰

辉煌!5个开始只是为了JPSTH的实施!

胡的详细

这很好。谢谢,so much

Tanmay Rajpathak

Wowww !

阳王

非常感谢,非常有用!

程薛

亨瑞克

伊恩

非常好,非常灵活,非常快速地得到复杂的图表显示良好。我希望随着时间的推移,它将朝着更完整的ggplot2功能发展!

菲利普Ulbrich

Lalitta Suriya-Arunroj

马太福音

我继续使用和享受这个提交。所有功能似乎都正常工作(我不能说stat_fit();在它需要曲线拟合工具箱)。

继续努力,皮埃尔!

马太福音

我真的很喜欢这份报告,因为
1.它是颠覆性的,
2.它一直在不断更新,
3.这是有效的(大部分)。

它是否暴露了从数据生成定量图形的可视化的底层结构?不。

它能和R-lang中的ggplot2竞争吗?不。

安德里亚书册

Benedikt

伟大的臣服和美丽的情节。

希望您有时间使用ggplot2中的其他可用内容进一步扩展功能。

里卡多piedrahita

伟大的提交,真的加快了我的一些绘图,但我不能让日期标记选项正确工作。它在y轴上很好,但在x轴上不行。

Ferrea恩里科

迈克尔·伯杰

Ikko

MATLAB版本兼容性
使用R2012b创建
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!