使用Julia的Gadfly包绘制精美图形_2020-07-12Sunday

## 开始测试

using Gadfly, RDatasets, RCall

iris = dataset("datasets", "iris")

typeof(iris)

# DataFrame

#@ 查看数据的前六行内容

print(first(iris, 6))

# 6×5 DataFrame

# │ Row │ SepalLength │ SepalWidth │ PetalLength │ PetalWidth │ Species │

# │    │ Float64    │ Float64    │ Float64    │ Float64    │ Cat…    │

# ├─────┼─────────────┼────────────┼─────────────┼────────────┼─────────┤

# │ 1  │ 5.1        │ 3.5        │ 1.4        │ 0.2        │ setosa  │

# │ 2  │ 4.9        │ 3.0        │ 1.4        │ 0.2        │ setosa  │

# │ 3  │ 4.7        │ 3.2        │ 1.3        │ 0.2        │ setosa  │

# │ 4  │ 4.6        │ 3.1        │ 1.5        │ 0.2        │ setosa  │

# │ 5  │ 5.0        │ 3.6        │ 1.4        │ 0.2        │ setosa  │

# │ 6  │ 5.4        │ 3.9        │ 1.7        │ 0.4        │ setosa  │

#@ 绘制第一张图

plot(iris, x=:SepalLength, y=:SepalWidth)

#@ 保存绘制的图形到本地

### 保存为SVG格式

p = plot(iris, x=:SepalLength, y=:SepalWidth, Geom.point);

img = SVG("iris_plot.svg", 14cm, 8cm)

draw(img, p)

### 保存为PDF格式

using Cairo

using Fontconfig

img = PDF("iris_plot.pdf", 14cm, 10cm)

draw(img, p)

### 保存为PNG格式

img = PNG("iris_plot.png", 14cm, 10cm)

draw(img, p)

# Alternatively one can manually call display on a Plot object. This workflow is necessary when display would not otherwise be called automatically.

function get_to_it(d)

  ppoint = plot(d, x=:SepalLength, y=:SepalWidth, Geom.point)

  pline = plot(d, x=:SepalLength, y=:SepalWidth, Geom.line)

  ppoint, pline

end

ps = get_to_it(iris)

map(display, ps)

p2 = plot(iris, x=:SepalLength, y=:SepalWidth, Geom.point, Geom.line)

img = PNG("iris_point_and_line_plot.png", 14cm, 10cm)

draw(img, p2)

img = PDF("iris_point_and_line_plot.pdf", 14cm, 10cm)

draw(img, p2)

## Arrays

SepalLength = iris.SepalLength

SepalWidth = iris.SepalWidth

plot(x=SepalLength, y=SepalWidth, Geom.point,

    Guide.xlabel("SepalLength"), Guide.ylabel("SepalWidth"))

## Color

plot(iris, x=:SepalLength, y=:SepalWidth, color=:Species, Geom.point);

# plot(iris, x=iris::SepalLength, y=iris::SepalWidth, color=iris::Species, Geom.point)

# TypeError: in typeassert, expected Type, got Array{Float64,1}

# plot(iris, x=iris:SepalLength, y=iris:SepalWidth, color=iris:Species, Geom.point);

# or equivalently for Arrays:

Color = iris.Species

p3 = plot(x=SepalLength, y=SepalWidth, color=Color, Geom.point,

    Guide.xlabel("SepalLength"), Guide.ylabel("SepalWidth"),

    Guide.colorkey(title="Species"))

img = PNG("iris_color_plot.png", 14cm, 10cm)

draw(img, p3)

img = PDF("iris_color_plot.pdf", 14cm, 10cm)

draw(img, p3)

## Continuous Scales

# Continuous scales can be transformed. In the next plot, the large animals are ruining things for us. Putting both axes on a log-scale clears things up.

#@ 图片组合,使用函数hstack

set_default_plot_size(21cm ,8cm)

mammals = dataset("MASS", "mammals")

p1 = plot(mammals, x=:Body, y=:Brain, label=:Mammal, Geom.point, Geom.label)

img = PDF("mammals_body_and_brain.pdf", 14cm, 10cm)

draw(img, p1)

img = PNG("mammals_body_and_brain.png", 14cm, 10cm)

draw(img, p1)

p2 = plot(mammals, x=:Body, y=:Brain, label=:Mammal, Geom.point, Geom.label,

    Scale.x_log10, Scale.y_log10)

p12 = hstack(p1, p2)

img = PDF("mammals_comb.pdf", 15cm, 10cm)

draw(img, p12)

img = PNG("mammals_comb.png", 15cm, 10cm)

draw(img, p12)

print(first(mammals,10))

# 10×3 DataFrame

# │ Row │ Mammal          │ Body    │ Brain  │

# │    │ String          │ Float64 │ Float64 │

# ├─────┼─────────────────┼─────────┼─────────┤

# │ 1  │ Arctic fox      │ 3.385  │ 44.5    │

# │ 2  │ Owl monkey      │ 0.48    │ 15.5    │

# │ 3  │ Mountain beaver │ 1.35    │ 8.1    │

# │ 4  │ Cow            │ 465.0  │ 423.0  │

# │ 5  │ Grey wolf      │ 36.33  │ 119.5  │

# │ 6  │ Goat            │ 27.66  │ 115.0  │

# │ 7  │ Roe deer        │ 14.83  │ 98.2    │

# │ 8  │ Guinea pig      │ 1.04    │ 5.5    │

# │ 9  │ Verbet          │ 4.19    │ 58.0    │

# │ 10  │ Chinchilla      │ 0.425  │ 6.4    │

typeof(mammals)

# DataFrame

#@ 保存数据

using DelimitedFiles

new_data = open("mammals_data.csv", "w")

writedlm(new_data, mammals, ",")

# AbstractDataFrame is not iterable. Use eachrow(df) to get a row iterator or eachcol(df) to get a column iterator

close(new_data)

mammals

# 62×3 DataFrame

# │ Row │ Mammal    │ Body    │ Brain  │

# │    │ String    │ Float64 │ Float64 │

# ├─────┼────────────┼─────────┼─────────┤

# │ 1  │ Arctic fox │ 3.385  │ 44.5    │

# ⋮

# │ 61  │ Tree shrew │ 0.104  │ 2.5    │

# │ 62  │ Red fox    │ 4.235  │ 50.4    │

# Scale transformations include: _sqrt, _log, _log2, _log10, _asinh for the x, y, color aesthetics, and _area for the size aesthetic.

using Printf

Diamonds = dataset("ggplot2","diamonds")

Diamonds

# 53940×10 DataFrame

# │ Row  │ Carat  │ Cut    │ Color │ Clarity │ Depth  │ Table  │ Price │ X      │ Y      │ Z      │

# │      │ Float64 │ Cat…    │ Cat…  │ Cat…    │ Float64 │ Float64 │ Int32 │ Float64 │ Float64 │ Float64 │

# ├───────┼─────────┼─────────┼───────┼─────────┼─────────┼─────────┼───────┼─────────┼─────────┼─────────┤

# │ 1    │ 0.23    │ Ideal  │ E    │ SI2    │ 61.5    │ 55.0    │ 326  │ 3.95    │ 3.98    │ 2.43    │

# ⋮

# │ 53939 │ 0.86    │ Premium │ H    │ SI2    │ 61.0    │ 58.0    │ 2757  │ 6.15    │ 6.12    │ 3.74    │

# │ 53940 │ 0.75    │ Ideal  │ D    │ SI2    │ 62.2    │ 55.0    │ 2757  │ 5.83    │ 5.87    │ 3.64    │

p3= plot(Diamonds, x=:Price, y=:Carat, Geom.histogram2d(xbincount=25, ybincount=25),

    Scale.x_continuous(format=:engineering) )

img = PDF("diamonds_price_carat_histogram2d.pdf", 20cm, 15cm)

draw(img, p3)

img = PNG("diamonds_price_carat_histogram2d.png", 20cm, 15cm)

draw(img, p3)

p4= plot(Diamonds, x=:Price, y=:Carat, Geom.histogram2d(xbincount=25, ybincount=25),

    Scale.x_continuous(format=:plain),

    Scale.y_sqrt(labels=y->@sprintf("%i", y^2)),

    Scale.color_log10(minvalue=1.0, maxvalue=10^4),

    Guide.yticks(ticks=sqrt.(0:5)) )

img = PDF("diamonds_price_carat_histogram2d_2.pdf", 20cm, 15cm)

draw(img, p4)

img = PNG("diamonds_price_carat_histogram2d_2.png", 20cm, 15cm)

draw(img, p4)

p34 = hstack(p3, p4)

img = PDF("diamonds_comb.pdf", 30cm, 15cm)

draw(img, p34)

img = PNG("diamonds_comb.png", 30cm, 15cm)

draw(img, p34)

## Discrete Scales ##

mtcars = dataset("datasets","mtcars")

labeldict = Dict(4=>"four", 6=>"six", 8=>"eight")

p5 = plot(mtcars, x=:Cyl, color=:Cyl, Geom.histogram,

    Scale.x_discrete(levels=[4,6,8]), Scale.color_discrete(levels=[4,6,8]) )

p6 = plot(mtcars, x=:Cyl, color=:Cyl, Geom.histogram,

    Scale.x_discrete(labels=i->labeldict[i], levels=[8,6,4]),

    Scale.color_discrete(levels=[8,6,4]) )

p56 = hstack(p5, p6)

img = PDF("mtcars_cyl.pdf", 30cm, 15cm)

draw(img, p56)

# For discrete scales with a Theme palette, the order of levels and the order of the Theme palette match.

x, y = 0.55*rand(4), 0.55*rand(4)

print("x的内容为:",x,";y的内容为:",y)

# x的内容为:[0.026078572083341835, 0.38793499822192545, 0.38721812973576736, 0.31864486064946673];y的内容为:[0.31252641092827416, 0.535436887627406, 0.11158461909555882, 0.34650338563223454]

pp = plot( Coord.cartesian(xmin=0, ymin=0, xmax=1.0, ymax=1.0),

    layer(x=x, y=y, shape=["A"], alpha=["day","day","day","night"]),

    layer(x=1.0.-y[1:3], y=1.0.-x[1:3], shape=["B", "C","C"], alpha=["night"]),

    Scale.shape_discrete(levels=["A","B","C"]),

    Scale.alpha_discrete(levels=["day","night"]),

    Theme(discrete_highlight_color=identity, point_size=12pt,

  point_shapes=[Shape.circle, Shape.star1, Shape.star2], alphas=[0, 1.0],

        default_color="midnightblue" )

)

img = PDF("shape_and_color.pdf", 20cm, 15cm)

draw(img, pp)

img = PNG("shape_and_color.png", 20cm, 15cm)

draw(img, pp)

## Gadfly defaults ##

# If you don't supply Scales or Guides, Gadfly will make an educated guess.

gasoline = dataset("Ecdat", "Gasoline")

pp2 = plot(gasoline, x=:Year, y=:LGasPCar, color=:Country, Geom.point, Geom.line)

img = PDF("Gasoline_Ecdat.pdf", 20cm, 10cm)

draw(img, pp2)

img = PNG("Gasoline_Ecdat.png", 20cm, 10cm)

draw(img, pp2)

## Rendering ##

# Gadfly uses a custom graphics library called Compose, which is an attempt at a more elegant, purely functional take on the R grid package. It allows mixing of absolute and relative units and complex coordinate transforms. The primary backend is a native SVG generator (almost native: it uses pango to precompute text extents), though there is also a Cairo backend for PDF and PNG. See Backends for more details.

#

# Building graphics declaratively let's you do some fun things. Like stick two plots together:

fig1a = plot(iris, x=:SepalLength, y=:SepalWidth, Geom.point)

fig1b = plot(iris, x=:SepalWidth, Home)

fig1 = hstack(fig1a, fig1b)

mimg = PDF("iris_SepalLength_SepalWidth.pdf", 30cm, 15cm)

draw(mimg, fig1)

mimg = PNG("iris_SepalLength_SepalWidth.png", 30cm, 15cm)

draw(mimg, fig1)

# Ultimately this will make more complex visualizations easier to build. For example, facets, plots within plots, and so on. See Compositing for more details.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351