文章目录
正常显示中文
微软雅黑
plt.rcParams['font.sans-serif'] = ['SimHei']
宋体
plt.rcParams['font.sans-serif'] = ['SimSun']
如何设置中文宋体,英文新罗马字体,看这个链接:matplotlib如何设置中文为宋体,英文为新罗马Times New Roman
正常显示负号
plt.rcParams['axes.unicode_minus'] = False
隐藏右边框和上边框
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
将(0, 0)作为坐标原点
指定 x 轴绑定到 y 轴的 0 这个点上,指定 y 轴绑定到 x 轴的 0 这个点上
ax = plt.gca()
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))
隐藏刻度线
ax = plt.gca()
ax.xaxis.set_ticks_position('none')
ax.yaxis.set_ticks_position('none')
右侧和上侧也显示刻度
ax = plt.gca()
ax.tick_params(axis='both', which='both', direction='in')
ax.xaxis.set_ticks_position('both')
ax.yaxis.set_ticks_position('both')
坐标半刻度
ax = plt.gca()
ax.set_yticks(np.arange(10, 100, 20), minor=True)
其中10
是第一个半刻度的坐标值
坐标双刻度
fig, ax1 = plt.subplots(figsize=(10, 5))
ax1.plot(x, y1)
ax2 = ax1.twinx()
ax2.plot(x, y2, color='r')
坐标双刻度时显示图例
fig, ax1 = plt.subplots(figsize=(10, 5))
line1, = ax1.plot(x, y1)
ax2 = ax1.twinx()
line2, = ax2.plot(x, y2, color='r')
plt.legend(handles=[line1, line2])
特别注意line1
和line2
后面的这个逗号,否则会报错
设置颜色
柱状图
为不同柱子设定指定的颜色:
bars = plt.bar(x, data, width=0.2)
for i, bar in enumerate(bars):
if i < 12:
bar.set_facecolor('#ce3024')
elif i < 17:
bar.set_facecolor('#4f4f4f')
else:
bar.set_facecolor('#466b98')
结果如下图所示:
marker设置空心
plt.plot(x, y, marker='o', markeredgecolor='blue', markerfacecolor=(0, 0, 0, 0))
其中,markeredgecolor表示边缘颜色,设置为实际需要的颜色,markerfacecolor表示填充颜色,设置为透明,即可呈现空心效果:
图例常用设置
plt.legend(bbox_to_anchor=(1.01, 1.0), ncol=4, loc='upper left')
plt.tight_layout()
若需要将图例放置在图表的外部,可以用bbox_to_anchor
设置,大于1
的数值表示在图表外部。注意如果放置在图表外部发现显示不全,可以用plt.tight_layout()
解决这一问题
ncol
用于设置图例的列数,loc
表示放置图例的位置
有时图例显示的顺序与代码绘图的先后顺序不一致,如果要指定图例的顺序,可以使用handles
参数,例如:
bars = plt.bar(x1, data1, label='bar')
line, = plt.plot(x2, data2, label='line')
plt.legend(handles=[bars, line])
需要注意line
后的逗号必须加上,否则会报错
对于箱型图,则需要取出boxes['boxes']
:
boxes = plt.boxplot(data)
plt.legend(handles=boxes['boxes'], labels=['pass', 'fail'])
我发现箱型图只能通过这种方式显示图例,直接plt.legend()
会报错说找不到标签,即使是plt.boxplot
中设置了labels
参数
设置图例无边框:
plt.legend(frameon=False)
Latex 语法
如果绘图时标签等文本出现上下标等,需要使用Latex
语法,在字符串的前后加上$
符号,中间即可使用Latex
语法,如下设置包含下标的y
轴标签:
label = r'$T_{ci}(K)$'
plt.ylabel(label)
结果如图所示:
如果遇到既需要用Latex
语法,又含有变量,需要写两个大括号:
label = fr'$T_{{XZ}}={m:.4f}T_{{SX}}{c:.4f}$' + '\n' + fr'$r^2={fit_similarity:.4f}$'
axins.plot(y2, fit_line, color='black', linestyle='-', label=label)
结果如图所示:
局部放大
首先创建局部放大图,(0.35, 0.08, 0.4, 0.4)
四元组中前2个参数分别表示图左下角的x
坐标、y
坐标,后2个参数分别表示图的长度和宽度(顺序有可能记错了),根据实际情况调整。
ax = plt.gca()
axins = ax.inset_axes((0.35, 0.08, 0.4, 0.4))
之后跟绘制大图一样,比如axins.plot
绘制折线图即可。
调整子图间距
plt.tight_layout()
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.1, hspace=0.25)
wspace
表示子图左右之间的距离,hspace
表示子图上下之间的距离
子图大小不规则
from matplotlib import gridspec
spec = gridspec.GridSpec(ncols=2, nrows=2, width_ratios=[2, 1], height_ratios=[1, 2], wspace=0.5, hspace=0.5)
plt.subplot(spec[0])
...
plt.subplot(spec[3])
width_ratios
和height_ratios
分别设置子图的宽度与高度比例,之后原本用于绘制第一个子图的语句plt.subplot(2, 2, 1)
替换成plt.subplot(spec[0])
即可
横坐标为时刻数据
import matplotlib.dates as mdates
import datetime
# 将时间字符串转换为 datetime 对象
time_objects = [datetime.datetime.strptime(t, '%H:%M') for t in time_strings]
# 将 datetime 对象转换为 matplotlib 能识别的日期格式
times = mdates.date2num(time_objects)
ax = plt.gca()
# 设置主刻度为每 4 小时
ax.xaxis.set_major_locator(mdates.HourLocator(interval=4))
# 设置时间标签显示格式
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
plt.plot(times, y)
效果如下图所示:
Pandas 文件读写
写文件
import pandas as pd
data = {}
data['x'] = [1, 2, 3]
data['y'] = [0.1, 0.2, 0.3]
df = pd.DataFrame(data)
save_path = 'test.xlsx'
df.to_excel(save_path, index=False)
如果列长度不相等:
import pandas as pd
data = {}
data['x'] = [1, 2, 3]
data['y'] = [0.1, 0.2, 0.3]
data2 = {}
data2['z'] = [4, 5]
df = pd.concat([pd.DataFrame(data), pd.DataFrame(data2)], axis=1)
save_path = 'test.xlsx'
df.to_excel(save_path, index=False)
分组
x_label = '年份'
label1 = '农村家庭可支配(元)'
label2 = '城市家庭可支配(元)'
# 按年份分组并计算平均值
grouped_df = df.groupby(x_label).agg({label1: 'mean', label2: 'mean'}).reset_index()