【学习笔记】python数据可视化之matplotlib实践第八章

坐标轴高阶应用

(1)设置坐标轴的位置和展示形式

1.向画布中任意位置添加任意数量的坐标轴

import matplotlib.pyplot as plt
import numpy as np
#创建一个新的子图(axes),参数[0.05, 0.7, 0.3, 0.3]分别表示子图的左下角坐标(x0, y0)为 (0.05, 0.7),宽度和高度分别为 0.3。frameon=True表示显示子图的边框;aspect='equal'表示设置子图的纵横比为相等,即 x 和 y 轴的单位长度在显示上相等
plt.axes([0.05,0.7,0.3,0.3],frameon = True,aspect = 'equal')

plt.plot(np.arange(3),[0,1,0],color = 'blue',linewidth = 2,linestyle = '--')

plt.axes([0.3,0.4,0.3,0.3],frameon = True,aspect = 'equal')
plt.plot(2+np.arange(3),[0,1,0],color = 'b',linewidth = 2,linestyle = '-')

plt.axes([0.55,0.1,0.3,0.3],frameon = True,aspect = 'equal')
plt.plot(4+np.arange(3),[0,1,0],color = 'b',linewidth = 2,linestyle = ':')

plt.show()

运行结果: 

2.调整已经确定的坐标轴的显示、隐藏与刻度范围等问题

import matplotlib.pyplot as plt
import numpy as np

plt.axes([0.05,0.7,0.3,0.3],frameon = True,aspect = 'equal')
plt.plot(np.arange(3),[0,1,0],color = 'blue',linewidth = 2,linestyle = '--')
plt.ylim(0,1.5)
plt.axis('image')#将坐标轴设置为 “image” 模式,通常会使坐标轴的纵横比与数据的范围相匹配,以确保图像不失真。


plt.axes([0.3,0.4,0.3,0.3],frameon = True,aspect = 'equal')
plt.plot(2+np.arange(3),[0,1,0],color = 'b',linewidth = 2,linestyle = '-')
plt.ylim(0,15)
plt.axis([2.1,3.9,0.5,1.9])#手动设置坐标轴的范围,x 轴从 2.1 到 3.9,y 轴从 0.5 到 1.9

plt.axes([0.55,0.1,0.3,0.3],frameon = True,aspect = 'equal')
plt.plot(4+np.arange(3),[0,1,0],color = 'b',linewidth = 2,linestyle = ':')
plt.ylim(0,1.5)
plt.axis('off')#关闭这个子图的坐标轴显示。

plt.show()

运行结果: 

3.使用函数axis()绘制坐标轴 

import matplotlib.pyplot as plt
import numpy as np

plt.plot(4+np.arange(3),[0,1,0],color = 'b',linewidth = 4,linestyle = ':')
plt.axis([3,7,-0.5,3])

plt.show()

代码说明:1.基本上都是先调用axes()绘制坐标轴,然后调用函数axis()在原来坐标轴的基础上调整坐标轴的视图显示情况,包括可见性、范围和比例协调性等。

2.我们也可以跟上面代码一样通过调用axis()实现绘制坐标轴,在绘制图形的可视化需求。 

运行结果: 

(2)使用两种方法控制坐标轴刻度的显示

1.方法1:调用Axes.set_xticks()和Axes.set_yticks()实例方法

import matplotlib.pyplot as plt

ax1 = plt.subplot(121)
ax1.set_xticks(range(0,251,50))
plt.grid(True,axis = 'x')

ax2 = plt.subplot(122)
ax2.set_xticks([])
plt.grid(True,axis = 'x')

plt.show()

运行结果: 

如果不设置坐标轴刻度,那么网格线也不会被设置。设置刻度,包括设置刻度标签和刻度线。

2.方法2:调用函数setp()

import matplotlib.pyplot as plt

ax1 = plt.subplot(221)
plt.setp(ax1.get_xticklabels(),visible = True)
plt.setp(ax1.get_xticklines(),visible = True)
plt.grid(True,axis = 'x')

ax2 = plt.subplot(222)
plt.setp(ax2.get_xticklabels(),visible = True)
plt.setp(ax2.get_xticklines(),visible = False)
plt.grid(True,axis = 'x')

ax3 = plt.subplot(223)
plt.setp(ax3.get_xticklabels(),visible = False)
plt.setp(ax3.get_xticklines(),visible = True)
plt.grid(True,axis = 'x')

ax4 = plt.subplot(224)
plt.setp(ax4.get_xticklabels(),visible = False)
plt.setp(ax4.get_xticklines(),visible = False)
plt.grid(True,axis = 'x')

plt.show()

运行结果: 

方法1是不画刻度元素,而方法2是画刻度元素,然后控制显示还是隐藏。不画刻度元素自然没有参考线,但是画了刻度元素后,又将其隐藏,参考线并不会消失。 

 3.棉棒图的定制化展示

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0.5,2*np.pi,20)
y = np.random.randn(20)

markerline,stemlines,baseline = plt.stem(x,y)

plt.setp(markerline,color = 'chartreuse',marker = 'D')
plt.setp(stemlines,linestyle = '-.')
baseline.set_linewidth(2)

plt.show()

代码说明:1.使用 plt.stem 绘制火柴杆图。它将返回三个对象,分别是标记线(markerline)、茎线(stemlines)和基线(baseline)

2.使用 plt.setp(设置属性)函数来设置标记线的属性。这里将标记线的颜色设置为 “chartreuse”(黄绿色) 

运行结果: 

4.坐标轴的样式和位置的定制化展示

import matplotlib.pyplot as plt
import numpy as np

from calendar import day_name
from matplotlib.ticker import FormatStrFormatter

fig = plt.figure()
ax = fig.add_axes([0.2,0.2,0.7,0.7])
#将底部和左侧的坐标轴脊线向外移动 10 个点的位置,以增加图表与坐标轴之间的距离
ax.spines['bottom'].set_position(('outward',10))
ax.spines['left'].set_position(('outward',10))
#将顶部和右侧的坐标轴脊线设置为不可见。
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')

x = np.arange(1,8,1)
y = 2*x+1
ax.scatter(x,y,c = 'orange',s = 50,edgecolors='orange')
#遍历 x 轴的刻度线,设置颜色为蓝色,标记大小为 2,标记边缘宽度为 5
for tickline in ax.xaxis.get_ticklines():
    tickline.set_color('blue')
    tickline.set_markersize(2)
    tickline.set_markeredgewidth(5)
#遍历 x 轴的主要刻度标签,设置颜色为石板蓝色,字体大小为 15,旋转角度为 20。
for ticklabel in ax.get_xmajorticklabels():
    ticklabel.set_color('slateblue')
    ticklabel.set_fontsize(15)
    ticklabel.set_rotation(20)
ax.yaxis.set_major_formatter(FormatStrFormatter(r'$\yen%1.1f$'))
plt.xticks(x,day_name[0:7],rotation = 20)
#明确设置 y 轴的刻度线位置在左侧,x 轴的刻度线位置在底部
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')

for tickline in ax.yaxis.get_ticklines():
    tickline.set_color('lightgreen')
    tickline.set_markersize(2)
    tickline.set_markeredgewidth(5)
for ticklabel in ax.get_xmajorticklabels():
    ticklabel.set_color('slateblue')
    ticklabel.set_fontsize(18)

ax.grid(ls = ':',lw = 1,color = 'gray',alpha = 0.5)
plt.show()

运行结果: 

(3)控制坐标轴的显示

此部分在上面代码中就有体现

#将顶部和右侧的坐标轴脊线设置为不可见。
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
#明确设置 y 轴的刻度线位置在左侧,x 轴的刻度线位置在底部
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')

通过 ax.spines['right'].set_color('none')是将右边框去掉,但是刻度线还是保留下来了。再添加ax.yaxis.set_ticks_position('left')就可以将右边框的刻度线去掉的展示效果。通过这类语句可以改变刻度标签和刻度线的显示位置。

(4)移动坐标轴的位置

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_axes([0.2,0.2,0.7,0.7])
#将底部和左侧的坐标轴脊线向外移动 10 个点的位置,以增加图表与坐标轴之间的距离
ax.spines['bottom'].set_position(('outward',10))
ax.spines['left'].set_position(('outward',10))
#将顶部和右侧的坐标轴脊线设置为不可见。
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')

ax.spines['bottom'].set_position(('data',0))#('data', 0)表示将底部脊线移动到数据坐标中的 0 位置。这意味着底部坐标轴将与数据中的 y = 0 位置对齐
ax.spines['left'].set_position(('data',0))#同样,('data', 0)将左侧脊线移动到数据坐标中的 0 位置,即左侧坐标轴将与数据中的 x = 0 位置对齐

x = np.linspace(-2*np.pi,2*np.pi,200)
y = np.sin(x)
ax.plot(x,y,c = 'orange')
#明确设置 y 轴的刻度线位置在左侧,x 轴的刻度线位置在底部
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')

ax.grid(ls = ':',lw = 1,color = 'gray',alpha = 0.5)
plt.show()

以下呈现有关键语句和无关键语句的运行结果: 

 关键语句为:

ax.spines['bottom'].set_position(('data',0))#('data', 0)表示将底部脊线移动到数据坐标中的 0 位置。这意味着底部坐标轴将与数据中的 y = 0 位置对齐
ax.spines['left'].set_position(('data',0))#同样,('data', 0)将左侧脊线移动到数据坐标中的 0 位置,即左侧坐标轴将与数据中的 x = 0 位置对齐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值