使用 Python 科学绘图

使用 matplotlib 绘图

图型

点线图 plot

plot(x, y) # 最简单的,x y 是一一对应的数组
plot(x, y, color='green', marker='o', linestyle='dashed', linewidth=2, markersize=12)

colors
markers
Linestyles
colormaps

Base Colors:

只要点,不要线:

plot(x, y,linewidth=0)

散点图 scatter

参考网址

plt.scatter(X, Y, c=Z, marker='s') # 散点用 X Y 表示,用 Z 着色。

云图 contourf

T,X1,Y1=[],[],[]
input_file = open('T.csv')
for line in islice(input_file, 1, None):
u=line.split(',')
Y1.append(float(u[1]))
X1.append(float(u[2]))
T.append(float(u[0]))



xi=np.linspace(min(X1),max(X1),1000)
yi=np.linspace(min(Y1),max(Y1),1000)
[XX,YY]=np.meshgrid(xi,yi)
ZZ=griddata((X1,Y1),T,(XX,YY))

ax1 = plt.subplot(121)
im=plt.contourf(XX, YY, ZZ, 20,cmap=cc.cm["fire"])

越界时指定颜色,其中,extend : {‘neither’, ‘both’, ‘min’, ‘max’}

levels=np.arange(-10,4200000,1000)
cp=plt.contourf(XX, YY, ZZ,levels=levels,cmap=Cube1_20.mpl_colormap,extend='both')
cp.cmap.set_under('yellow')
cp.cmap.set_over('cyan')#注意这个顺序,此行须在 plt.colorbar 之前
cbar = plt.colorbar(cp)
cbar.ax.set_title('sourcePV')
plt.axis(xmin =0, xmax = 0.5, ymin = 0, ymax = 0.55)

小于某个数时颜色全部为空白:

levels=np.arange(0.0015,0.7515,0.0015)
im=plt.contourf(XX, YY, ZZ,levels=levels)#这里不能使用extend,如果使用的话,那么小于下限时,颜色直接是 min 的颜色。

设置图中的数值上下限:

设置色条中的上下限:

等值线

im=ax2.contourf(XX, YY, ZZ, 200,cmap=cc.cm["fire"]) #这是云图,200表示分为200道
cp=ax2.contour(XX, YY, ZZ, 1,levels=[1000],linewidths=2) #这是等值线,1表示一条等值线,levels里边是这个值

配件

图片颜色

自带调色:

cm = plt.cm.get_cmap('winter') 
im=plt.contourf(XX, YY, ZZ, 20, alpha=1, cmap=cm)

palettable 调色:

cmap=plt.get_cmap("YlOrRd") 
im=plt.contourf(XX, YY, ZZ, 20, alpha=1, cmap=cmap)

from palettable.mycarta import Cube1_20
im=plt.contourf(XX, YY, ZZ, 20, alpha=1, cmap=Cube1_20.mpl_colormap)

map=cc.cm["fire"]

色条 colorbar

最简单使用:

sc = plt.scatter(X, Y, c=Z, s=1,cmap=Cube1_20.mpl_colormap)  
cbar = plt.colorbar(sc)

所有用法:
API
API2
色条位置偏移使用pad,色条尺寸缩小使用 shrink

cbar = plt.colorbar(cp,pad = 0.07,shrink=0.8)
指定色条位置的具体坐标
```PYTHON
cbar_ax = fig.add_axes([0.19, 0.06, 0.7, 0.015])#left,bottom,left_length,bottom_length
cbar=plt.colorbar(sc_CH2O, cax=cbar_ax,orientation='horizontal')

指定色条的坐标值:

cbar.formatter.set_powerlimits((0, 0))#科学计数法
cbar_ticks = np.linspace(0., 5e-3, num=3, endpoint=True)
cbar.set_ticks(cbar_ticks)

色条上的数值,怎么才能显示 max min?

色条上的tick,如果色条竖直,默认是朝右的,如果色条水平,默认朝下的。可以这样更改:

cbar.ax.xaxis.set_ticks_position('top')#色条水平,horizontal
cbar.ax.yaxis.set_ticks_position('left')#色条竖直,vertical

也可以这样:

cbar.ax.yaxis.tick_left()

添加变量名,推荐使用 set_title:
set_title
set_title 默认在最上方,不管色条是水平还是竖直。有个参数pad表示向上偏移距离。
用法:

cbar.ax.set_title('$\Omega\ [-]$',pad=10)

set_label
用法:

cbar.set_label('$\Omega\ [-]$')

变量名换个位置:
色条是水平的,这里的bottom表示变量名放在水平色条的下边,labelpad是向下的偏移距离。

cbar.set_label('T',verticalalignment='bottom', labelpad=-10)

Vertical alignment must be one of (‘top’, ‘bottom’, ‘center’, ‘baseline’)
Horizontal alignment must be one of (‘center’, ‘right’, ‘left’)
对于水平色条,horizontalalignment 不管用?

配色

matplotlib
palettable
源码:https://github.com/jiffyclub/palettable
colorcet
源码:https://github.com/pyviz/colorcet/releases
使用举例:

from palettable.colorbrewer.sequential import Greys_9
cp=plt.scatter(X, Y, c=Z,cmap=Greys_9.mpl_colormap)
cmap=pyplot.cm.jet
cmap=pyplot.cm.jet
import colorcet as cc
cmap=cc.cm["blues"]
from palettable.mycarta import Cube1_20
cmap=Cube1_20.mpl_colormap

反转颜色

自带的反转就是在后边加一个 _r

反转非自带的颜色
def reverse_colourmap(cmap, name = 'my_cmap_r'):
"""
In:
cmap, name
Out:
my_cmap_r

Explanation:
t[0] goes from 0 to 1
row i: x y0 y1 -> t[0] t[1] t[2]
/
/
row i+1: x y0 y1 -> t[n] t[1] t[2]

so the inverse should do the same:
row i+1: x y1 y0 -> 1-t[0] t[2] t[1]
/
/
row i: x y1 y0 -> 1-t[n] t[2] t[1]
"""
reverse = []
k = []

for key in cmap._segmentdata:
k.append(key)
channel = cmap._segmentdata[key]
data = []

for t in channel:
data.append((1-t[0],t[2],t[1]))
reverse.append(sorted(data))

LinearL = dict(zip(k,reverse))
my_cmap_r = mpl.colors.LinearSegmentedColormap(name, LinearL)
return my_cmap_r


cmap=cc.cm["fire"]
cmap_r = reverse_colourmap(cmap)

图例 legend

plt.plot(R_Mean,U_Mean,linestyle='--',marker='o', color='r',label="sim") # 这里的 label 即图例
plt.legend(loc='upper left') # 图例位置

高级用法:

ax1.legend(loc='upper right', bbox_to_anchor=(1.05, 4.3), ncol=3,fontsize=10)#放置到合适的位置,这里 loc不起作用,ncol表示三栏

科学计数法

色条:

sc = plt.scatter(X, Y, c=Z, s=1,cmap=Cube1_20.mpl_colormap)  
cbar = plt.colorbar(sc)
cbar.formatter.set_powerlimits((-1, 1))
cbar.update_ticks()

这样小于 10^(-1),或者大于 10^(1) 的值就会用科学计数法。

坐标轴:

子图 subplot

plt.subplots_adjust(left=0.11,bottom=0.1,top=0.97,right=0.9,hspace=0.000001,wspace=0.000001)  
i=0
for Z in ['2','10','30','50']:
i=i+1
ax1 = plt.subplot(410+i)
plt.plot(R_Mean,U_Mean,linestyle='--',marker='o', color='r',label="sim")

subplot(410+i) 表示子图 4*1 排列,即 4 行 1 列。此处的循环,令 i 分分别等于 1 2 3 4。
也可以用subplot(4,1,i)表示。

设置坐标轴 label

plt.xlabel('r [mm]',fontsize=12)
```
###标题
```PYTHON
plt.title('source_Yc',fontsize=12)

调整坐标轴范围

plt.axis([0, 4, 0, 4])   # 改变取值范围,[xmin, xmax, ymin, ymax]

自定义刻度

x_new=np.array([5,10,15,20])
plt.xticks(x_new)

隐藏坐标

在包含几个子图的图标中,可能需要隐藏一些重复的坐标

ax1 = plt.subplot(420+i) 
plt.setp(ax1.get_xticklabels(), visible=False)
plt.setp(ax1.get_yticklabels(), visible=False)

隐藏 ticks和label

ax1.set_xticks([])

隐藏子刻度

plt.minorticks_off()

ticks

ticks 小数点位数

import matplotlib.ticker as ticker
plt.gca().xaxis.set_major_formatter(ticker.FormatStrFormatter('%.6f'))

python 相关

读取数据

T,X,Y=[],[],[]
input_file = open('/home/of/Desktop/TTTT.csv')
for line in islice(input_file, 1, None):#这里忽略第一行
u=line.split(',')#间隔是逗号
T.append(float(u[0]))
X.append(float(u[1]))
Y.append(float(u[2]))

上边这段代码的功能是:依次读取 4 个文件(mm_2_UMean.xy,mm_2_UMean.xy,mm_2_UMean.xy,mm_2_UMean.xy),把文件中的第一列和第二列分别赋值给 Python 中的数组 R_MeanU_Mean
其中 islice 中的参数 1 表示跳过文件的第一行(第一行可能是文字描述之类的)。

利用正则表达式获取当前目录下的某些文件

import glob
files = glob.iglob(r'0.*')
for file in files:
print file

换行

ylabel('this is vertical\ntest', multialignment='center')#\n表示换行

紧凑布局

画完图之后,设置一下:

plt.tight_layout()

灰色系列填充彩图

在图中使用其它字体

https://stackoverflow.com/a/53645383
我成功操作的经历:

把字体拷贝到:
/public/home/yao1/packages_ZY/anaconda_ZY/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf
然后:
rm -rf ~/.cache/matplotlib/

使用字体:

from matplotlib import rcParams
rcParams.update({'font.size': 12, 'font.family': 'Times New Roman'})

from matplotlib import rcParams
rcParams.update({'font.size': 12, 'font.family': 'simsun'})

ax1.legend(loc='upper right', bbox_to_anchor=(0.92, 3.7), ncol=3,fontsize=10,prop={'family':'simsun'})

plt.text(1.03,5.4,'平均值',fontname='simsun')

使用 LaTeX 公式
$包围起来即可

服务器上,ssh到某个节点,使用python绘图时,报错

QXcbConnection: Could not connect to display

solution:
在脚本的最前边加上

import matplotlib
matplotlib.use('Agg')
文章作者: Yan Zhang
文章链接: https://openfoam.top/matplotlib/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 OpenFOAM 成长之路
微信打赏给博主更多动力吧~