Python-matplotlib绘制带箭头x-y坐标轴图形

栏目:资讯发布:2023-10-03浏览:2收藏

Python-matplotlib绘制带箭头x-y坐标轴图形,第1张

在Python的数据可视化库中,采用matplotlib绘制相关图形时,若不加任何设定,一般的x-y坐标轴是不带箭头且是一个封闭的矩形。我们以Sigmoid函数的绘制,给大家展示一下。

matplotlib的辅助工具,包含一系列对坐标轴设置的框架。其中的axisartist包就用来设置坐标轴的类型。

1创建画布并引入axisartist工具。

2绘制带箭头的x-y坐标轴

我们先把原始的如上图的所有坐标轴隐藏,即长方形的四个边。

然后用axnew_floating_axis在绘图区添加坐标轴x、y,这里的axnew_floating_axis(0,0),第一个0代表平行直线,第二个0代表该直线经过0点。同样,axaxis["y"] = axnew_floating_axis(1,0),则代表竖直曲线且经过0点。

再次,xaxis["x"]set_axisline_style("->", size = 10)表示给x轴加上箭头,"->"表示是空箭头,size = 10表示箭头大小。axaxis["y"]set_axisline_style("-|>", size = 10)中"-|>"则是实心箭头。

最后,设置x、y轴上刻度显示方向,对于x轴是刻度标签在上面还是下面,y轴则是刻度标签在左边还是右边。

3在带箭头的x-y坐标轴背景下,绘制函数图像

tist坐标轴工具——将原始坐标轴均隐藏掉——添加新的基于原点的x与y轴——为新坐标轴加入箭头,并设置刻度显示方式——加入图形。

画正方形

import turtle

import time

#定义绘制时画笔的颜色

turtlecolor("purple")

#定义绘制时画笔的线条的宽度

turtlesize(5)

#定义绘图的速度 

turtlespeed(10)

#以0,0为起点进行绘制

turtlegoto(0,0)

#绘出正方形的四条边

for i in range(4):

    turtleforward(100)

    turtleright(90)

#画笔移动到点(-150,-120)时不绘图

turtleup()

turtlegoto(-150,-120)

#再次定义画笔颜色

turtlecolor("red")

#在(-150,-120)点上打印"Done"

turtlewrite("Done")

timesleep(3)

用Python实现Circos图的绘制在线绘制的Circos有一定局限性,如对数据的要求、个性化的局限和处理速度等的问题,但如果你是一个Pythoneer或者喜欢用更加Pythonic的方式来个性化地绘制Circos图,那么今天就跟随我一起用代码实现这一目标吧!

安装Circos包

首先,登录Python的包索引网站Python Package Index(PyPI,正确读音是:Pie Pee Ai),找到Circos包的下载页:

https://pypipythonorg/pypi/Circos/135

该包/模块的作者是我的好友Eric Ma。你可以选择下载wheeler文件,然后本地安装。也可以在shell下直接通过pip进行安装:

pipinstallcircos

注意,所支持的Python版本必须是3x,对2不支持。

选择数据

当安装了circos包后,我们就可以直接应用这个包来写代码了。为了演示方便,我需要应用一些数据。作为内科医师,就让我来展示一下老本行:处理药物与肝酶细胞色素P450的相互关系的可视化。由于是为了抛砖引玉,所以绘制出的Circos图相对简单。

我们先从美国FDA官网下载不同细胞色素相关的各种口服药物表。共202种常用的口服药物,涵盖内科学、肿瘤学、神经科和心理学等学科。数据文件如下:

可以看到这个数据的结构:是按肝细胞色素酶进行分类,共分8个列。这8个细胞色素酶分别是:CYP1A2,CYP2B6, CYP2C8, CYP2C9, CYP2C19, CYP2D6, CYP2E1和CYP3A4。我们将要建立各个口服药与这些肝酶之间关系的Circos图,从而了解通过相同肝酶代谢或转化的药物之间是否存在相互作用。

导入各个模块和读入数据

导入各个模块:

fromcircosimportCircosPlot

importxlrd

importpandasaspd

importnumpyasnp

读入文件:

filename='\\MedicationInteractionxlsx'

book=xlrdopen_workbook(filename)

print('File loaded!')

提取数据:

nrows=booksheet_by_name('Sheet1')nrows

header=booksheet_by_name('Sheet1')row_values(0)

data=[booksheet_by_name('Sheet1')row_values(i) fori inrange(1, nrows)]

df=pdDataFrame(data, columns =header)

df[df==''] = npnan

读取后,药物和酶的数据为pandas的DataFrame数据结构,细胞色素P450酶的名字为columns的名字。我们可以检查一下数据:

修数据,尤其是处理NA数据

df_dict={}

foriinrange(len(dfcolumns)):

df_dict[dficol(i)name] =list(dficol(i)dropna())

节点和连线

创建节点(nodes)数据,在我这个例子里就是各个药物和肝酶:

nodes=[]

forkeyindf_dictkeys():

nodesextend(df_dict[key])

nodes=list(nodes)

headers=list(dfcolumns)

enzymes=['0']  5

forheaderinheaders:

enzymesappend(header)

enzymesextend(['0']5)

nodesextend(enzymes)

创建连线(edges)数据,我们应用tuple(元组)这个数据结构来表示药物与特定肝酶之间的关系:

edges_origin=[]

forkeyindf_dictkeys():

forvalue indf_dict[key]:

edges_originappend((key, value))

绘图

绘制Circos图:

c=CircosPlot(nodes, edges_origin, radius =10,

nodecolor="blue",

edgecolor="red",

)

cdraw()

得到了下面这张所有药物与肝酶之间的图:

左上方是8个肝脏细胞色素P450酶(CYP1A2、CYP2B6、CYP2C8、CYP2C9、CYP2C19、CYP2D6、CYP2E1和CYP3A4)。其它点即为202种口服药物。每种药物都与参与代谢和转化它的P450酶相连。与相同酶连接的不同药物,理论上应该都存在相互作用,但具体如何还要看与酶的作用机理。

个性化绘图

如果我们打算分别可视化出不同肝酶的关系图形,我们只需改变连线信息,即edges信息:

edges=[]

‍forvalueindf_dict['CYP2B6']:

edgesappend(('CYP2B6', value))

c=CircosPlot(nodes, edges, radius =10,

nodecolor="orange",

edgecolor="orange",

)

cdraw()

从而我们得到了各种肝酶所代谢和转化药物的图形

用PS将它们合并:

相同肝酶所代谢和转化的药物用相同颜色的edges表示。

显示特定药物

最后,我们可以挑选其中一些感兴趣的药物来进行观察,例如,我从这202个药物中指定几个我感兴趣的药物:

propafenone(心律平), acetaminophen(对乙酰氨基酚), paclitaxel(紫杉醇), ibuprofen(布洛芬), losartan(洛沙坦), omeprazole(奥美拉唑), carvediolo(卡维地洛), codeine(可待因), theophylline(茶碱), quinidine(奎尼丁), verapamil(异搏定), lovastatin(洛伐他汀), nitrendipine(尼群地平)

然后重新建立edges:

medications=['propafenone', 'acetaminophen', 'paclitaxel', 'ibuprofen', 'losartan', 'omeprazole', 'carvedilol', 'codeine', 'theophylline', 'quinidine', 'verapamil', 'lovastatin', 'nitrendipine']

edges_candidate=set()

formedicationinmedications:

foredge inedges_origin:

if medication==edge[1]:

edges_candidateadd(edge)

edges_candidate=list(edges_candidate)

然后再绘图:

c=CircosPlot(nodes, edges_candidate, radius =10,

nodecolor="black",

edgecolor="black",

)

cdraw()

从而得到这张图。

然后我们继续看,这次我们用海龟绘图,程序包,去画画,

看看海龟绘图都有哪些方法

可以看到,先导入import turtle 海龟绘图

然后turtleshowturtle() 会显示一个箭头

turtlewrite("hello world") 会显示对应文字

然后turtleforward(300),会向前走300像素

然后看看海龟绘图的,坐标体系

然后turtlecolor("red"),把画笔颜色换成红色

然后turtleleft(90)把箭头,逆时针转90度

然后turtleforward(300) 向前移动300个像素

然后turtlegoto(0,50) 走到0,50这个坐标点去

再看一下坐标系,原点0,0开始操作

还有上面这些操作,我们也试一试

turtlegoto(0,0)是回到原点

turtlepenup()是抬起画笔

然后turtlegoto(0,300),turtlegoto(0,0) 然后再去,turtlependown()放下画笔

然后再去turtlegoto(0,50) turtlegoto(50,50)走到对应的坐标去

然后再去turtlecircle(100),以100为半径,逆时针画一个圆

可以看到,半径是100对吧

几周前,R语言社区经历了一场关于画图工具的讨论。对于我们这种外人来说,具体的细节并不重要,但是我们可以将一些有用的观点运用到 Python 中。讨论的重点是 R 语言自带的绘图工具 base R 和 Hadley Wickham 开发的绘图工具 ggplot2 之间的优劣情况。如果你想了解更多细节内容,请阅读以下几篇文章:

其中最重要的两个内容是:

不是所有人都认同第二个观点,ggplot2确实无法绘制出所有的图表类型,但是我会利用它来做分析。

以下是 2016 年 4 月写的关于绘图工具的概述。出于多方面的原因,绘图工具的选取更多地取决于个人偏好,因此本文介绍的 Python 绘图工具也仅代表我的个人使用偏好。

Matplotlib 是一个强大的工具,它是 Pandas' builtin-plotting Seaborn 的基础。 Matplotlib 能够绘制许多不同的图形,还能调用多个级别的许多 API 。我发现 pyplot api 非常好用,你可能用不上 Transforms 或者 artists ,但是如果你有需求的话可以查阅帮助文档。我将从 pandas seaborn 图开始介绍,然后介绍如何调用 pyplot API

DataFrame Series 拥有 plot 的命名空间,其中有许多图形类别可供选择(line, hist, scatter, 等等)。 Pandas 对象还提供了额外的用于增强图形展现效果的数据,如索引变量。

由于 pandas 具有更少的向后兼容的限制,所以它具有更好的美学特性。从这方面来说,我认为 pandas 中的 DataFrameplot 是一个非常实用的快速探索性分析的工具。

Michael Waskom 所开发的 Seaborn 提供了一个高层次的界面来绘制更吸引人统计图形。 Seaborn 提供了一个可以快速探索分析数据不同特征的 API 接口,接下来我们将重点介绍它。

Bokeh 是一款针对浏览器开发的可视化工具。

matplotlib 一样,Bokeh

拥有一系列 API 接口。比如 glpyhs 接口,该接口和 matplotllib 中的 Artists 接口非常相似,它主要用于绘制环形图、方形图和多边形图等。最近 Bokeh 又开放了一个新的图形接口,该接口主要用于处理词典数据或 DataFrame 数据,并用于绘制罐头图。

以下是一些本文没有提到的可视化工具:

我们将利用 ggplot2 中的 diamonds 数据集,你可以在 Vincent Arelbundock's RDatasets 中找到它(pdread_csv(' http://vincentarelbundockgithubio/Rdatasets/csv/ggplot2/diamondscsv') ),此外我们还需要检测是否已经安装 feather

[站外上传中……(4)]

Bokeh 提供了两个 API,一个是低级的 glyph API,另一个是高级的 Charts API。

[站外上传中……(5)]

还不是很清楚我们应该在啥时候利用 Bokeh 来进行探索性分析,不过它的交互式功能可以激发我的兴趣。就个人而言,由于习惯问题我平时仍然一直使用 matplotlib 来绘图,我还无法完全切换到 Bokeh 中。

我非常喜欢 Bokeh 的仪表盘功能和 bokeh server 的 webapps。

[站外上传中……(6)]

[站外上传中……(7)]

[站外上传中……(8)]

matplotlib 并不局限于处理 DataFrame 数据,它支持所有使用 getitem 作为键值的数据类型。

[站外上传中……(9)]

[站外上传中……(10)]

我们从列变量的名字中提取出轴标签,利用 Pandas 可以更加便捷地绘制一系列共享 x 轴数据的图形。

[站外上传中……(11)]

[站外上传中……(12)]

本文中的剩余部分将重点介绍 seaborn和为什么我认为它是探索性分析的强大工具。

我强烈建议你阅读 Seaborn 的 introductory notes,这上面介绍了 seaborn 的设计逻辑和应用领域。

我们可以通过一个稳定的且易懂的 API 接口来调用 Seaborn。

事实上,seaborn 是基于 matplotlib 开发的,这意味着如果你熟悉 pyplot API的话,那么你可以很容易地掌握 seaborn。

大多数 seaborn 绘图函数的参数都由 x, y, hue, 和 data 构成(并不是所有的参数都是必须的)。如果你处理的对象是 DataFrame,那么你可以直接将列变量的名称和数据集的名称一同传递到绘图函数中。

[站外上传中……(13)]

[站外上传中……(14)]

[站外上传中……(15)]

[站外上传中……(16)]

我们可以很轻易地探究两个变量之间的关系:

[站外上传中……(17)]

[站外上传中……(18)]

或者一次探究多个变量之间的关系:

[站外上传中……(19)]

[站外上传中……(20)]

pariplot 是 PairGrid 的一个包装函数,它提供了 seaborn 一个重要的抽象功能——Grid。Seaborn 的 Grid 将 matplotlib 中Figure 和数据集中的变量联系起来了。

我们有两种方式可以和 grids 进行交互操作。其一,seaborn 提供了类似于 pairplot 的包装函数,它提前设置了许多常见任务的参数;其二,如果你需要更多的自定义选项,那么你可以直接利用 Grid 方法。

[站外上传中……(21)]

[站外上传中……(22)]

[站外上传中……(23)]

34312 rows × 7 columns

[站外上传中……(24)]

[站外上传中……(25)]

FaceGrid 可以通过控制分面变量来生成 Grid图形,其中PairGrid是它的一个特例。接下来的案例中,我们将以数据集中的 cut 变量为分面变量来绘制图像:

[站外上传中……(26)]

[站外上传中……(27)]

最后一个案例展示了如何将 seaborn 和 matplotlib 结合起来。gaxes是matplotlibAxes的一个数组,gfig是matplotlibFigure的一个特例。这是使用 seaborn 时常见的一个模式:利用 seaborn 的方法来绘制图像,然后再利用 matplotlib 来调整细节部分。

我认为 seaborn 之所以吸引人是因为它的绘图语法具有很强的灵活性。你不会被作者所设定的图表类型所局限住,你可以根据自己的需要创建新的图表。

[站外上传中……(28)]

[站外上传中……(29)]

[站外上传中……(30)]

[站外上传中……(31)]

本来,我打算准备更多的例子来介绍 seaborn,但是我会将相关链接分享给大家。Seaborn 的说明文档写的非常详细。

最后,我们将结合 scikit-learn 来介绍如何利用 GridSearch 来寻找最佳参数。

[站外上传中……(32)]

[站外上传中……(33)]

[站外上传中……(34)]

原文链接: http://tomaugspurgergithubio/modern-6-visualizationhtml

译者:Fibears

采用matplotlib作图时默认设置下是无法显示中文的,例如编写如下python脚本,

#-- coding: utf-8 --

from pylab import

t = arange(-4pi, 4pi, 001)

y = sin(t)/t

pltplot(t, y)

plttitle(u'钟形函数')

pltxlabel(u'时间')

pltylabel(u'幅度')

pltshow()

显示出来的结果如图1所示,可见标题、标签都无法正常显示中文:

图1

实际上,matplotlib是支持unicode编码的,出现图1的问题主要是没有找到合适的中文字体,在matplotlib的配置文件中,可以看到字体的默认设置如下:

#fontfamily : sans-serif

#fontsans-serif : Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif

并没有中文字体,所以我们只要手动添加中文字体的名称就可以了,不过并不是添加我们熟悉的“宋体”或“黑体”这类的名称,而是要添加字体管理器识别出的字体名称,matplotlib自身实现的字体管理器在文件font_managerpy中,自动生成的可用字体信息在保存在文件fontListcache里,可以搜索这个文件查看对应字体的名称,例如simheittf对应的名称为’SimHei’,simkaittf对应的名称为’KaiTi_GB2312’等。因此我们只要把这些名称添加到配置文件中去就可以让matplotlib显示中文,修改的方法有两种:

1 直接修改配置文件matplotlibrc

在配置文件中找到fontsans-serif的设置,然后添加需要的中文字体名称,例如:

fontsans-serif : SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif

2 动态设置(推荐方式)

在python脚本中动态设置matplotlibrc,这样不需要更改配置文件,方便灵活,例如:

mplrcParams['fontsans-serif'] = ['SimHei']

修改后的代码如下:

#-- coding: utf-8 --

from pylab import

mplrcParams['fontsans-serif'] = ['SimHei']

t = arange(-4pi, 4pi, 001)

y = sin(t)/t

pltplot(t, y)

plttitle(u'钟形函数')

pltxlabel(u'时间')

pltylabel(u'幅度')

pltshow()

显示出来的结果如图2所示,可见标题、标签都能正常显示中文:

图2

但是细心些可以看出图2显示的结果并不正确,注意对比图1和图2的横坐标的坐标值,会发现图2中负轴的横坐标值不对,负号不见了!很明显,这不是程序的错误,而是由于更改了字体导致显示不出负号,在配置文件中我们可以在axes相关设置里找到如下设置:

#axesunicode_minus : True

可见默认情况下采用的是unicode的minus,看来我们选择的字体对这点支持不够,所以只要把它设置为False就可以了,最终的代码如下:

#-- coding: utf-8 --

from pylab import

mplrcParams['fontsans-serif'] = ['SimHei']

mplrcParams['axesunicode_minus'] = False

t = arange(-4pi, 4pi, 001)

y = sin(t)/t

pltplot(t, y)

plttitle(u'钟形函数')

pltxlabel(u'时间')

pltylabel(u'幅度')

pltshow()

最终显示的结果如图3所示,一切都正常了。

Python-matplotlib绘制带箭头x-y坐标轴图形

在Python的数据可视化库中,采用matplotlib绘制相关图形时,若不加任何设定,一般的x-y坐标轴是不带箭头且是一个封闭的矩形。我们以Sigmoid...
点击下载
热门文章
    确认删除?
    回到顶部