如图,我们想把每个例子的多个指标(Dice, HD, IOU)画在同一个图中,应该怎么操作呢
使用到的工具是: matplotlib (Version: 3.3.3)
from mpl_toolkits.axes_grid1 import host_subplot
from mpl_toolkits import axisartist
import matplotlib.pyplot as plt
host = host_subplot(111, axes_class=axisartist.Axes)
plt.subplots_adjust(right=0.75)
par1 = host.twinx()
par2 = host.twinx()
par2.axis["right"] = par2.new_fixed_axis(loc="right", offset=(60, 0))
par1.axis["right"].toggle(all=True)
par2.axis["right"].toggle(all=True)
p1, = host.plot([1, 2, 3,4,5,6,7,8,9,10],[82.85,82.69,82.89,83.52,82.48,82.93,82.78,82.99,82.81,83.51], 'o-', label="Dice")
p2, = par1.plot([1, 2, 3,4,5,6,7,8,9,10], [4.26,4.22,4.32,4.42,4.67,4.41,4.21,4.93,4.96,4.02], 'o-', label="HD95")
p3, = par2.plot([1, 2, 3,4,5,6,7,8,9,10], [83,80,85,82,82.48,82.93,82.78,82.99,79,83.51], 'o-', label="IOU")
host.set_xlim(0, 12) # 坐标轴长度
host.set_ylim(82, 84)
par1.set_ylim(4, 5)
par2.set_ylim(77, 88)
host.set_xlabel("example")
host.set_ylabel("Dice Score (%)")
par1.set_ylabel("Hausdorff Distance (mm)")
par2.set_ylabel("IOU (%)")
host.legend()
host.axis["left"].label.set_color(p1.get_color())
par1.axis["right"].label.set_color(p2.get_color())
par2.axis["right"].label.set_color(p3.get_color())
plt.show()
plt.plot()
注意,版本不同可能略有差异,导致跑不通
代码关键解析:
- p1,p2,p3 后面的逗号不能省略
- p1,p2,p3 代表不同的指标
- *.set_xlim 设置坐标轴的显示范围,范围要能大到足够包含所有值
- 其余的就是一些美化设置
文章持续更新,可以关注微信公众号【医学图像人工智能实战营】获取最新动态,一个关注于医学图像处理领域前沿科技的公众号。坚持已实践为主,手把手带你做项目,打比赛,写论文。凡原创文章皆提供理论讲解,实验代码,实验数据。只有实践才能成长的更快,关注我们,一起学习进步~
我是Tina, 我们下篇博客见~
白天工作晚上写文,呕心沥血
觉得写的不错的话最后,求点赞,评论,收藏。或者一键三连
如图,我们想把每个例子的多个指标(Dice, HD, IOU)画在同一个图中,应该怎么操作呢使用到的工具是: matplotlib (Version: 3.3.3)from mpl_toolkits.axes_grid1 import host_subplotfrom mpl_toolkits import axisartistimport matplotlib.pyplot as plthost = host_subplot(111, axes_class=axisartist.Axes).
首先补充一下:两种体系7种颜色rgbymck(红,绿,蓝,黄,品红,青,黑)在科研的过程中,坐标系中的XY不一定就是等尺度的。例如在声波中对Y轴取对数。肆意我们也必须知道这种坐标系如何画出来的。有3个函数可以实现这种功能,分别是:semilogx(),semilogy(),loglog()。它们分别表示对X轴,Y轴,XY轴取对数。下面在一个2*2的figure里面来比较这四个子图(还有plot())。如上面的代码所示,对一个低通滤波器函数绘图。得到四个不同坐标尺度的图像。如下图所示极坐标系中的点由一个夹角和一段相对于中心位置的距离来表示。其实在plot()函数里面本来就有一个polar的属性,
Matlab里做多给轴的函数很直接,双轴是plotyy, 三轴是plotyyy, 四轴是plot4y,更多应该是multiplotyyy。
而matplotlib似乎可以用figure.add_axes()来实现,探索中……
多轴绘制的图层原理
公众号“Matplotlib小讲堂”(微信号:Matplotlibclass)一篇文章介绍了Matplotlib的图层,结合自己的理解,摘要总结...
所用到的函数如下:
matplotlib.pyplot.contour(*args, **kwargs)
matplotlib.pyplot.contourf(*args, **kwargs)
两个函数的keyword是一致的,由于两个函数的返回值相同,所以可以结合使用。前者是绘制等高线,后者是填充等高线。
keyword建议查看官方文档。
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
第一种是通过数组创建坐标网格与Z值
#生成一个x轴是1~3,y轴是7~8的网格坐标
X = [
l=[i for i in range(5)]
s = float(sum(data))
percent = [round(data[0] / s * 100, 1),round(data[1] / s * 100, 1),
round
共用一个x轴,而y轴不一样。本文给出两种解决办法,一般情况下,大家指代的可能是第一种。这种办法其实严格来说,并不是共用一个x轴,而是图一使用下面的x轴和左边的y轴,图二使用上面的x轴和右边的y轴。所以,为了将这两个图放在一起,图二的y轴数据需要取负号,这样图二的y轴就会是反的。从而两幅图,图一数据向上增长,图二数据向下增长。
这个思路很简单,就是将图1画在y轴的正半轴,图2画在y轴的负半轴。缺点是由于是同一个y轴,从而两者的刻度比例是一样的。从而,如果图1的数据是非常大,图2的数据非常小,那么画出来的图就很
Python Matplotlib.pyplot 概要零、导包壹、折线图1. 输入x,y轴数据2. 设置标题和坐标3. 绘制并显示图像----------------------锦上添花分割线----------------------4. 按需更改线段风格5. 按需把两条/多条线画在同一幅图上并添加图例6. 按需改变图表风格7. 按需保存图片贰、柱状图1. 定义2. 绘制纵向条形图3. 绘制横向条形图未完待续
api需科学上网,见:https://matplotlib.org/3.3.2/api/
一、定义画图函数
我将画出的图像的代码部分封装到一个画图函数中,这样将来用到其他的代码中,便于实现。
def draw_function(x1_vals, y1_vals, x2_vals,y2_vals,x_label):
plt.subplot(2,1,1)
知识点1:subplots()
plt.subplots()可以创建一张画布和一系列的子图。可以返回画布对象matplotlib.figure.Figure,以及子图的坐标轴对象matplotlib.axes._subplots.AxesSubplot。
plt.subplots(2,3,figsize=(10,8))
画了一个画布,并且自动按照2行 * 3列
data = {'name': ['A', 'B', 'C', 'D', 'E'],
'value': [10, 5, 20, 15, 25]}
df = pd.DataFrame(data)
# 绘制柱状图
plt.bar(df['name'], df['value'])
# 对y轴数据进行排序
df = df.sort_values('value')
plt.gca().set_ylim(df['value'].min(), df['value'].max())
# 显示图形
plt.show()