R语言不少库都可以方便的画dotplot,但是低频使用R这么多年,我依旧觉得R不是一门真正的编程语言。目前,在python中绘制dotplot貌似没有很轻量、方便的库,因此工作之余写了这个python_dotplot包,方便自己也希望能够方便他人吧。
可以通过pypi快速安装:
pipinstallpython_dotplot该package当然可能存在一定的bug,所以也会处于不断迭代的过程中,可以通过以下方式获得特定或最新版本
pipinstallpython_dotplot--upgradepipinstallpython_dotplot==0.0.1b1如果通过--upgrade参数不能获得最新版本,国内镜像会有一定的延迟,可指定pypi官方源指定镜像:
importdotplotimportdotplot.utilsimportpandasaspd%configInlineBackend.figure_format='retina'#如果你的电脑设备是视网膜屏,可指定该参数渲染jupyter图像,会超清晰,超好看包的层级结构很简单,主要包括以下模块:
dotplot
├──cmap.py#自定义colormap
├──core.py#实现了Dotplot类,用于封装数据以及绘图
├──hierarchical.py#实现了层次聚类,用于支持dotplot行和列通过层次聚类进行自动排序
├──__init__.py#初始化模块
└──utils.py#实用函数,目前是夹带私货,我自己用的预处理函数,也许对其他人也有用
我们首先需要准备一个数据,这里要求输入必须是一个tidydata格式的pandasDataframe,简而言之,tidydata是指在该数据框中每一行是一个观测,每一列是一个属性,下面以示例数据为例:
首先我们可以借助DotPlot的类方法parse_from_tidy_data对数据进行封装,然后直接调用plot函数进行绘图。当然,你也可以通过DotPlot的构造函数__init__()来实例化DotPlot对象。
new_keys={'item_key':'Description','group_key':'group','sizes_key':'Count'}dp=dotplot.DotPlot.parse_from_tidy_data(data,**new_keys)sct=dp.plot(size_factor=10,cmap='Reds')#通过size_factor调节图中点的大小
dp=dotplot.DotPlot.parse_from_tidy_data(data,item_key='Description',group_key='group',sizes_key='Count')#该效果完全同上,这是python语言特性sct=dp.plot(size_factor=10,cmap='Reds')
我们可以通过color_key指定data中的列做颜色映射。
new_keys={'item_key':'Description','group_key':'group','sizes_key':'Count','color_key':'pvalue'}dp=dotplot.DotPlot.parse_from_tidy_data(data,**new_keys)sct=dp.plot(size_factor=10,cmap='Reds',cluster_row=True)
可以通过circle_key增加一列作为虚线圆圈的映射。
DEFAULT_CLUSTERPROFILE_KEYS={'item_key':'Description','group_key':'group','sizes_key':'Count','color_key':'pvalue','circle_key':'qvalue'}dp=dotplot.DotPlot.parse_from_tidy_data(data,**DEFAULT_CLUSTERPROFILE_KEYS)sct=dp.plot(size_factor=10,cmap='Reds',cluster_row=True)
当然,更多的参数我们可以通过signature来查看,我对这些参数都做了类型注释,应该是通俗易懂的:
sct=dp.plot(size_factor=10,cmap='Reds',cluster_row=True,dot_title='Count',circle_title='-log10(qvalue)',colorbar_title='-log10(pvalue)')
dotplot在数据可视化中是一个强有力的展示方式,选择一个合适的可视化方式胜过千言万语
最后,最适合的可视化方式是最直观、最简洁的,不是炫技,别被花里胡哨的可视化所迷住双眼而忽略了信息的传达。