善用图片-你将有不一样的可视化效果

2021-02-22 15:13:41 浏览数 (1)

01. 引言

今天在查找资料时发现了一个超酷的R语言第三方颜色包 R-ghibli,目前可以直接通过 CRAN 安装的。官网(https://ewenme.github.io/ghibli/)所示的图例如下:

(感觉作者是宫崎骏的真爱粉啊

)

包就先介绍到这,具体大家可以去官网查看。下面我们就通过一个具体例子进行说明,同时我们结合图片,使作品可视化效果翻倍

02.Seaborn可视化展示

接下来我们将使用Python-Seabornggplot2 ghibli包进行可视化与图片的结合展示。

数据处理

由于现阶段主要做的是数据可视化部分,涉及到的数据处理代码又会给人繁琐感觉,这里我们直接给出处理过的数据类型,所需数据如下:

主要涉及到的为pandas常用的数据处理操作。接下来我们使用Seaborn进行统计直方图绘制,具体代码如下:

代码语言:javascript复制
import seaborn  as sns
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes

plt.rcParams['font.family'] = ['Roboto Mono']
plt.rcParams['font.weight'] = 'bold'
fig, ax = plt.subplots(figsize=(8,5),dpi = 200,facecolor='#323332',edgecolor='#323332')
ax.set_facecolor("#323332")

palette = ['#F5EDCD','#F4C59D','#EAA69D','#B2B8B1','#9EA7BC','#838A8F','#BB958B']
img = r"E:Data_resoursesDataCharm 公众号PythonMatplotlib-image-chartstotoro.png"
image = plt.imread(img)

barhs = sns.barplot(x="n", y="genre", data=ghibli_genres.sort_values(by='n',ascending=False),
                    palette=palette,ax=ax)
#添加图片
aximins = inset_axes(ax,width=2.5,height=4,
                      bbox_to_anchor=(.6, .5, .5, .5),
                      bbox_transform=ax.transAxes)
im = aximins.imshow(image,zorder=0)
aximins.axis('off')

#定制化设置
for spine in ['top','bottom','left','right']:
    ax.spines[spine].set_color("#FFFFFF")
    ax.spines[spine].set_linewidth(1)
ax.tick_params(labelsize = 10,colors="#FFFFFF")
ax.set_xlim(left=0,right=20)
ax.set_xlabel('Counts',fontweight='bold',c="#FFFFFF",fontsize=17)
ax.set_ylabel(ylabel='Most common gemres',fontweight='bold',c="#FFFFFF",fontsize=17)

ax.text(.87,-.1,'nVisualization by DataCharm',transform = ax.transAxes,
        ha='center', va='center',fontsize = 7,color='white',fontweight='bold',family='Roboto Mono')
plt.savefig(r'F:DataCharm商业艺术图表仿制statis_photo.png',width=7,height=3,
            dpi=900,bbox_inches='tight',facecolor='#323332')
plt.show()

知识点:

(1)sns.barplot()集成化绘制条形图

代码语言:javascript复制
barhs = sns.barplot(x="n", y="genre", data=ghibli_genres.sort_values(by='n',ascending=False),
                    palette=palette,ax=ax)

通过data的排序设置解决了柱形图绘制前的排序需求。

(2)图片添加及位置调整:

代码语言:javascript复制
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
#添加图片
aximins = inset_axes(ax,width=2.5,height=4,
                      bbox_to_anchor=(.6, .5, .5, .5),
                      bbox_transform=ax.transAxes)
im = aximins.imshow(image,zorder=0)
aximins.axis('off')

最终的可视化效果如下:

当然,这里的颜色我们还是采用吸取后再自行设置而成。

01. ggplot2 ghibli 可视化展示

借助于ggplot2 强大的绘图功能和ghibli 包的颜色设置,我们不需要自行定义颜色,这也算是我的第一篇ggplot2 可视化绘制教程哦

直接上代码,如下:

代码语言:javascript复制
library(tidyverse)
library(ghibli)
#自定义字体
windowsFonts(Roboto_Mono = windowsFont("Roboto Mono"))

img_a <- png::readPNG('E:/Data_ning/Jupyter Projects/R Data-Process-Vis Projects/img/totoro.png') 
a <- grid::rasterGrob(img_a, interpolate = T)

genres_plot <- ghibli_genres %>% 
  ggplot(aes(genre, n))  
    geom_col(aes(fill = genre))  
    coord_flip()  
    scale_y_continuous(limits = c(0, 20), expand = c(0.01, 0))  
    #使用了ghibli的颜色色系填充颜色
    scale_fill_ghibli_d("MononokeLight")  
    guides(fill = F)   
    labs(x = "Most common genres", y = "Count") 
    #添加图片,重点掌握哦!
    annotation_custom(a, xmin = 0.4, xmax = 6.75, ymin = 12, ymax = 23)  
    #自定义主题,需要设置的不必matplotlib少
    theme(axis.text = element_text(family = "Roboto_Mono",colour = "grey85"),
          axis.title.x = element_text(margin = unit(c(3.5, 0, 0, 0), "mm"), vjust = 1, size = 15, face = "bold",
                                     color = '#ffffff'), 
          axis.title.x.top = element_text(margin = margin(b = 6), vjust = 0), 
          axis.title.y = element_text(angle = 90, margin = unit(c(0, 3.5, 0, 0), "mm"), vjust = 1, size = 15, 
                                      face = "bold",color = '#ffffff'), 
          axis.title.y.right = element_text(angle = -90, margin = margin(l = 6), vjust = 0),
          axis.ticks.length = unit(3, "pt"),
          axis.ticks = element_line(colour = "grey85", size = .3),
          panel.grid = element_blank(),
          panel.border = element_rect(colour = "grey85", fill = NA, size = rel(1)),
          panel.background = element_rect(fill = '#333333', colour = '#333333'),
          plot.background = element_rect(fill = '#333333',colour = '#333333')
         )
ggsave("F:/DataCharm/商业艺术图表仿制/statis_photo_ggplot2.png",genres_plot, width = 5, height = 2.8, 
       dpi = 900)

可以看出,ggplot2和matplotlib的绘图体系还是有较大差异的,要想绘制出较美观的可视化作品,高度自定义设置是少不了的,所以就需要熟悉各种绘图函数哦,这点,两者倒是挺像的

结果如下:

知识点:

(1)ghibli 颜色包的使用

代码语言:javascript复制
scale_fill_ghibli_d("MononokeLight")

很简单的一个操作,用于填充颜色。

(2)图片添加

代码语言:javascript复制
img_a <- png::readPNG('E:/Data_ning/Jupyter Projects/R Data-Process-Vis Projects/img/totoro.png') 
a <- grid::rasterGrob(img_a, interpolate = T)

annotation_custom(a, xmin = 0.4, xmax = 6.75, ymin = 12, ymax = 23)

就可以根据坐标轴的刻度值进行具体的位置调整,这点还是比matplotlib 方便的多,大家可以直接记住啊!

(3)高度定制化操作

代码语言:javascript复制
theme(axis.text = element_text(family = "Roboto_Mono",colour = "grey85"),
          axis.title.x = element_text(margin = unit(c(3.5, 0, 0, 0), "mm"), vjust = 1, size = 15, face = "bold",
                                     color = '#ffffff'), 
          axis.title.x.top = element_text(margin = margin(b = 6), vjust = 0), 
          axis.title.y = element_text(angle = 90, margin = unit(c(0, 3.5, 0, 0), "mm"), vjust = 1, size = 15, 
                                      face = "bold",color = '#ffffff'), 
          axis.title.y.right = element_text(angle = -90, margin = margin(l = 6), vjust = 0),
          axis.ticks.length = unit(3, "pt"),
          axis.ticks = element_line(colour = "grey85", size = .3),
          panel.grid = element_blank(),
          panel.border = element_rect(colour = "grey85", fill = NA, size = rel(1)),
          panel.background = element_rect(fill = '#333333', colour = '#333333'),
          plot.background = element_rect(fill = '#333333',colour = '#333333')
         )

涉及到刻度、文本、绘图背景、网格等大量图表属性的设置,大家可以去ggplot2官网查看哦。

04. 总结

在普通的数据可视化结果中适当的 添加与之相关 的图片,可以使可视化作品更加美观哦。本期推文分别使用Python-SeabornR-ggplot2 绘制同一个可视化作品。后面凡是涉及到R绘制的,我都尽量推文对应的python版本的,这对自己也是个挑战哦

0 人点赞