我目前正在使用 scale_brewer() 进行填充,这些颜色看起来很漂亮(在屏幕上和通过彩色打印机),但在使用黑白打印机时相对均匀地打印为灰色 . 我搜索了在线 ggplot2 文档,但没有看到任何关于添加纹理来填充颜色的信息 . 有没有正式的方法来做到这一点,还是有人有他们使用的黑客?通过纹理,我的意思是像斜条,反向对角线条,点图案等,当黑白打印时会区分填充颜色 .
scale_brewer()
ggplot2
ggplot可以使用colorbrewer调色板 . 其中一些是“复印”友好的 . 那么mabe这样的东西对你有用吗?
ggplot(diamonds, aes(x=cut, y=price, group=cut))+ geom_boxplot(aes(fill=cut))+scale_fill_brewer(palette="OrRd")
在这种情况下,OrRd是在colorbrewer网页上找到的调色板:http://colorbrewer2.org/
复印友好:这表明给定的配色方案可以承受黑白复印 . 分歧计划无法成功复印 . 应采用顺序方案保持亮度差异 .
嘿伙计们这里是一个小小的黑客,以一种非常基本的方式解决纹理问题:
ggplot2: make the border on one bar darker than the others using R
编辑:我终于有时间给出一个简单的例子,说明这个hack在ggplot2中至少允许3种类型的基本模式 . 代码:
Example.Data<- data.frame(matrix(vector(), 0, 3, dimnames=list(c(), c("Value", "Variable", "Fill"))), stringsAsFactors=F) Example.Data[1, ] <- c(45, 'Horizontal Pattern','Horizontal Pattern' ) Example.Data[2, ] <- c(65, 'Vertical Pattern','Vertical Pattern' ) Example.Data[3, ] <- c(89, 'Mesh Pattern','Mesh Pattern' ) HighlightDataVert<-Example.Data[2, ] HighlightHorizontal<-Example.Data[1, ] HighlightMesh<-Example.Data[3, ] HighlightHorizontal$Value<-as.numeric(HighlightHorizontal$Value) Example.Data$Value<-as.numeric(Example.Data$Value) HighlightDataVert$Value<-as.numeric(HighlightDataVert$Value) HighlightMesh$Value<-as.numeric(HighlightMesh$Value) HighlightHorizontal$Value<-HighlightHorizontal$Value-5 HighlightHorizontal2<-HighlightHorizontal HighlightHorizontal2$Value<-HighlightHorizontal$Value-5 HighlightHorizontal3<-HighlightHorizontal2 HighlightHorizontal3$Value<-HighlightHorizontal2$Value-5 HighlightHorizontal4<-HighlightHorizontal3 HighlightHorizontal4$Value<-HighlightHorizontal3$Value-5 HighlightHorizontal5<-HighlightHorizontal4 HighlightHorizontal5$Value<-HighlightHorizontal4$Value-5 HighlightHorizontal6<-HighlightHorizontal5 HighlightHorizontal6$Value<-HighlightHorizontal5$Value-5 HighlightHorizontal7<-HighlightHorizontal6 HighlightHorizontal7$Value<-HighlightHorizontal6$Value-5 HighlightHorizontal8<-HighlightHorizontal7 HighlightHorizontal8$Value<-HighlightHorizontal7$Value-5 HighlightMeshHoriz<-HighlightMesh HighlightMeshHoriz$Value<-HighlightMeshHoriz$Value-5 HighlightMeshHoriz2<-HighlightMeshHoriz HighlightMeshHoriz2$Value<-HighlightMeshHoriz2$Value-5 HighlightMeshHoriz3<-HighlightMeshHoriz2 HighlightMeshHoriz3$Value<-HighlightMeshHoriz3$Value-5 HighlightMeshHoriz4<-HighlightMeshHoriz3 HighlightMeshHoriz4$Value<-HighlightMeshHoriz4$Value-5 HighlightMeshHoriz5<-HighlightMeshHoriz4 HighlightMeshHoriz5$Value<-HighlightMeshHoriz5$Value-5 HighlightMeshHoriz6<-HighlightMeshHoriz5 HighlightMeshHoriz6$Value<-HighlightMeshHoriz6$Value-5 HighlightMeshHoriz7<-HighlightMeshHoriz6 HighlightMeshHoriz7$Value<-HighlightMeshHoriz7$Value-5 HighlightMeshHoriz8<-HighlightMeshHoriz7 HighlightMeshHoriz8$Value<-HighlightMeshHoriz8$Value-5 HighlightMeshHoriz9<-HighlightMeshHoriz8 HighlightMeshHoriz9$Value<-HighlightMeshHoriz9$Value-5 HighlightMeshHoriz10<-HighlightMeshHoriz9 HighlightMeshHoriz10$Value<-HighlightMeshHoriz10$Value-5 HighlightMeshHoriz11<-HighlightMeshHoriz10 HighlightMeshHoriz11$Value<-HighlightMeshHoriz11$Value-5 HighlightMeshHoriz12<-HighlightMeshHoriz11 HighlightMeshHoriz12$Value<-HighlightMeshHoriz12$Value-5 HighlightMeshHoriz13<-HighlightMeshHoriz12 HighlightMeshHoriz13$Value<-HighlightMeshHoriz13$Value-5 HighlightMeshHoriz14<-HighlightMeshHoriz13 HighlightMeshHoriz14$Value<-HighlightMeshHoriz14$Value-5 HighlightMeshHoriz15<-HighlightMeshHoriz14 HighlightMeshHoriz15$Value<-HighlightMeshHoriz15$Value-5 HighlightMeshHoriz16<-HighlightMeshHoriz15 HighlightMeshHoriz16$Value<-HighlightMeshHoriz16$Value-5 HighlightMeshHoriz17<-HighlightMeshHoriz16 HighlightMeshHoriz17$Value<-HighlightMeshHoriz17$Value-5 ggplot(Example.Data, aes(x=Variable, y=Value, fill=Fill)) + theme_bw() + #facet_wrap(~Product, nrow=1)+ #Ensure theme_bw are there to create borders theme(legend.position = "none")+ scale_fill_grey(start=.4)+ #scale_y_continuous(limits = c(0, 100), breaks = (seq(0,100,by = 10)))+ geom_bar(position=position_dodge(.9), stat="identity", colour="black", legend = FALSE)+ geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.80)+ geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.60)+ geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.40)+ geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.20)+ geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.0) + geom_bar(data=HighlightHorizontal, position=position_dodge(.9), stat="identity", colour="black", size=.5)+ geom_bar(data=HighlightHorizontal2, position=position_dodge(.9), stat="identity", colour="black", size=.5)+ geom_bar(data=HighlightHorizontal3, position=position_dodge(.9), stat="identity", colour="black", size=.5)+ geom_bar(data=HighlightHorizontal4, position=position_dodge(.9), stat="identity", colour="black", size=.5)+ geom_bar(data=HighlightHorizontal5, position=position_dodge(.9), stat="identity", colour="black", size=.5)+ geom_bar(data=HighlightHorizontal6, position=position_dodge(.9), stat="identity", colour="black", size=.5)+ geom_bar(data=HighlightHorizontal7, position=position_dodge(.9), stat="identity", colour="black", size=.5)+ geom_bar(data=HighlightHorizontal8, position=position_dodge(.9), stat="identity", colour="black", size=.5)+ geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.80)+ geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.60)+ geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.40)+ geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.20)+ geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.0)+ geom_bar(data=HighlightMeshHoriz, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz2, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz3, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz4, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz5, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz6, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz7, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz8, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz9, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz10, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz11, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz12, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz13, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz14, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz15, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz16, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+ geom_bar(data=HighlightMeshHoriz17, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")
产生这个:
它不是超级漂亮,但它是我能想到的唯一解决方案 .
可以看出,我产生了一些非常基本的数据 . 为了获得垂直线,我只需创建一个数据框来包含我想要添加垂直线的变量,并多次重新绘制图形边框,每次减小宽度 .
类似的事情是针对水平线进行的,但是每次重绘都需要一个新的数据帧,我已经从与感兴趣的变量相关联的值中减去了一个值(在我的例子中为'5') . 有效降低杆的高度 . 实现起来很笨拙,可能会有更简化的方法,但这说明了如何实现 .
网格图案是两者的组合 . 首先绘制垂直线,然后添加水平线,将 fill 设置为 fill='transparent' ,以确保不绘制垂直线 .
fill
fill='transparent'
在有模式更新之前,我希望你们中的一些人觉得这很有用 .
编辑2:
另外还可以添加对角线图案 . 我在数据框中添加了一个额外的变量:
Example.Data[4,] <- c(20, 'Diagonal Pattern','Diagonal Pattern' )
然后我创建了一个新的数据框来保存对角线的坐标:
Diag <- data.frame( x = c(1,1,1.45,1.45), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid y = c(0,0,20,20), x2 = c(1.2,1.2,1.45,1.45), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid y2 = c(0,0,11.5,11.5),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines. x3 = c(1.38,1.38,1.45,1.45), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid y3 = c(0,0,3.5,3.5),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines. x4 = c(.8,.8,1.26,1.26), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid y4 = c(0,0,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines. x5 = c(.6,.6,1.07,1.07), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid y5 = c(0,0,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines. x6 = c(.555,.555,.88,.88), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid y6 = c(6,6,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines. x7 = c(.555,.555,.72,.72), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid y7 = c(13,13,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines. x8 = c(.8,.8,1.26,1.26), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid y8 = c(0,0,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines. #Variable = "Diagonal Pattern", Fill = "Diagonal Pattern" )
从那里我将geom_paths添加到上面的ggplot中,每个调用不同的坐标并在所需的条上绘制线条:
+geom_path(data=Diag, aes(x=x, y=y),colour = "black")+ # calls co-or for sig. line & draws geom_path(data=Diag, aes(x=x2, y=y2),colour = "black")+ # calls co-or for sig. line & draws geom_path(data=Diag, aes(x=x3, y=y3),colour = "black")+ geom_path(data=Diag, aes(x=x4, y=y4),colour = "black")+ geom_path(data=Diag, aes(x=x5, y=y5),colour = "black")+ geom_path(data=Diag, aes(x=x6, y=y6),colour = "black")+ geom_path(data=Diag, aes(x=x7, y=y7),colour = "black")
这导致以下结果:
这有点草率,因为我没有投入太多时间让线条完美地成角度和间隔开,但这应该作为概念的证明 .
显然,线条可以向相反方向倾斜,并且还存在对角网格划分的空间,就像水平和垂直网格一样 .
我认为这就是我在模式方面可以提供的所有内容 . 希望有人可以找到它的用途 .
编辑3:着名的遗言 . 我想出了另一种模式选项 . 这次使用 geom_jitter .
geom_jitter
我再次向数据框添加了另一个变量:
Example.Data[5,] <- c(100, 'Bubble Pattern','Bubble Pattern' )
我订购了我希望每种模式呈现的方式:
Example.Data$Variable = Relevel(Example.Data$Variable, ref = c("Diagonal Pattern", "Bubble Pattern","Horizontal Pattern","Mesh Pattern","Vertical Pattern"))
接下来,我创建了一个列,用于包含与x轴上预期目标栏关联的数字:
Example.Data$Bubbles <- 2
后跟列包含“气泡”y轴上的位置:
Example.Data$Points <- c(5, 10, 15, 20, 25) Example.Data$Points2 <- c(30, 35, 40, 45, 50) Example.Data$Points3 <- c(55, 60, 65, 70, 75) Example.Data$Points4 <- c(80, 85, 90, 95, 7) Example.Data$Points5 <- c(14, 21, 28, 35, 42) Example.Data$Points6 <- c(49, 56, 63, 71, 78) Example.Data$Points7 <- c(84, 91, 98, 6, 12)
最后,我将 geom_jitter 添加到上面的ggplot中,使用新列进行定位并重新使用'Points'来改变'bubbles'的大小:
+geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)+ geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)
每次运行绘图时,抖动都会以不同的方式定位“气泡”,但这是我输出的更好的输出之一:
有时候“气泡”会在国界外抖动 . 如果发生这种情况,请重新运行或直接以较大尺寸导出 . 如果您愿意,可以在y轴上的每个增量上绘制更多气泡,这将填充更多的空白区域 .
这可以构成7种模式(如果你包括相反的倾斜对角线和两者的对角网格),可以在ggplot中被黑客攻击 .
如果有人可以考虑一些,请随时建议更多 .
编辑4:我一直在使用包装函数来自动化ggplot2中的阴影/模式 . 一旦我扩展了函数以允许facet_grid图中的模式等,我将发布一个链接 . 这里是一个带有函数输入的输出,用于简单的条形图作为示例:
生病我准备好共享功能后添加最后一个编辑 .
编辑5:Here's a link我写的函数EggHatch使得向geom_bar绘图添加模式的过程更容易一些 .
目前还不可能,因为网格(ggplot2用来做实际绘图的图形系统)不支持纹理 . 抱歉!
我认为Docconcoct工作很棒,但现在我突然用谷歌搜索了一个特殊的包装--- Patternplot . 没有看到内部代码,但小插图似乎很有用 .
4 回答
ggplot可以使用colorbrewer调色板 . 其中一些是“复印”友好的 . 那么mabe这样的东西对你有用吗?
在这种情况下,OrRd是在colorbrewer网页上找到的调色板:http://colorbrewer2.org/
嘿伙计们这里是一个小小的黑客,以一种非常基本的方式解决纹理问题:
ggplot2: make the border on one bar darker than the others using R
编辑:我终于有时间给出一个简单的例子,说明这个hack在ggplot2中至少允许3种类型的基本模式 . 代码:
产生这个:
它不是超级漂亮,但它是我能想到的唯一解决方案 .
可以看出,我产生了一些非常基本的数据 . 为了获得垂直线,我只需创建一个数据框来包含我想要添加垂直线的变量,并多次重新绘制图形边框,每次减小宽度 .
类似的事情是针对水平线进行的,但是每次重绘都需要一个新的数据帧,我已经从与感兴趣的变量相关联的值中减去了一个值(在我的例子中为'5') . 有效降低杆的高度 . 实现起来很笨拙,可能会有更简化的方法,但这说明了如何实现 .
网格图案是两者的组合 . 首先绘制垂直线,然后添加水平线,将
fill
设置为fill='transparent'
,以确保不绘制垂直线 .在有模式更新之前,我希望你们中的一些人觉得这很有用 .
编辑2:
另外还可以添加对角线图案 . 我在数据框中添加了一个额外的变量:
然后我创建了一个新的数据框来保存对角线的坐标:
从那里我将geom_paths添加到上面的ggplot中,每个调用不同的坐标并在所需的条上绘制线条:
这导致以下结果:
这有点草率,因为我没有投入太多时间让线条完美地成角度和间隔开,但这应该作为概念的证明 .
显然,线条可以向相反方向倾斜,并且还存在对角网格划分的空间,就像水平和垂直网格一样 .
我认为这就是我在模式方面可以提供的所有内容 . 希望有人可以找到它的用途 .
编辑3:着名的遗言 . 我想出了另一种模式选项 . 这次使用
geom_jitter
.我再次向数据框添加了另一个变量:
我订购了我希望每种模式呈现的方式:
接下来,我创建了一个列,用于包含与x轴上预期目标栏关联的数字:
后跟列包含“气泡”y轴上的位置:
最后,我将
geom_jitter
添加到上面的ggplot中,使用新列进行定位并重新使用'Points'来改变'bubbles'的大小:每次运行绘图时,抖动都会以不同的方式定位“气泡”,但这是我输出的更好的输出之一:
有时候“气泡”会在国界外抖动 . 如果发生这种情况,请重新运行或直接以较大尺寸导出 . 如果您愿意,可以在y轴上的每个增量上绘制更多气泡,这将填充更多的空白区域 .
这可以构成7种模式(如果你包括相反的倾斜对角线和两者的对角网格),可以在ggplot中被黑客攻击 .
如果有人可以考虑一些,请随时建议更多 .
编辑4:我一直在使用包装函数来自动化ggplot2中的阴影/模式 . 一旦我扩展了函数以允许facet_grid图中的模式等,我将发布一个链接 . 这里是一个带有函数输入的输出,用于简单的条形图作为示例:
生病我准备好共享功能后添加最后一个编辑 .
编辑5:Here's a link我写的函数EggHatch使得向geom_bar绘图添加模式的过程更容易一些 .
目前还不可能,因为网格(ggplot2用来做实际绘图的图形系统)不支持纹理 . 抱歉!
我认为Docconcoct工作很棒,但现在我突然用谷歌搜索了一个特殊的包装--- Patternplot . 没有看到内部代码,但小插图似乎很有用 .