PyCharm中IPython.display无法正常显示Matplotlib相关性矩阵图
问题原因
IPython.display.display仅在Jupyter Notebook/Lab这类交互笔记本环境下能自动渲染Matplotlib图像,在PyCharm的普通Python运行环境中只会输出Figure对象的字符串表示,也就是你看到的Figure(1200x900),不会触发绘图渲染。- 代码里用的
FigureCanvasAgg是纯文件输出的非交互后端,本身就不支持弹窗/界面显示,只适合把图导出为本地图片文件。 - 代码本身还有两处小问题:一是重复调用
set_xticklabels,第二次无参数配置的调用会覆盖第一次设置的旋转、加粗字体效果;二是漏写了y轴刻度标签的设置,最终y轴只会显示数字不会显示列名。
可用修复方法
- 方法一:PyCharm中弹窗显示(完全保留Matplotlib面向对象API写法,不依赖pyplot全局绘图接口)
把非交互的Agg后端换成支持TK界面的交互后端,绑定TK窗口实现弹窗显示,修正后完整代码:
import pandas as pd from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg as FigureCanvas from matplotlib.figure import Figure import tkinter as tk wine_quality = pd.read_csv('Matplotlib-3.0-Cookbook-master/Chapter02/winequality.csv', delimiter=';') corr = wine_quality.corr() fig = Figure(figsize=(12, 9)) # 初始化TK弹窗载体 root = tk.Tk() root.title("相关性矩阵热力图") canvas = FigureCanvas(fig) canvas.get_tk_widget().pack() axs = fig.add_subplot(111) corimage = axs.imshow(corr, cmap='hot') fig.colorbar(corimage) fontd = {'fontsize': 10, 'fontweight': 'bold', 'rotation': 45} axs.set(xticks=range(len(corr)), yticks=range(len(corr)), title='Correlation Matrix') axs.set_xticklabels(corr.columns, fontdict=fontd) axs.set_yticklabels(corr.columns) canvas.draw() root.mainloop()
- 方法二:直接导出图片到本地
如果不需要弹窗交互查看,保留原来的Agg后端即可,删掉IPython相关的导入和display(fig)调用,在代码最后加一行保存命令:
运行后会在代码同级目录生成渲染完成的热力图文件。fig.savefig('correlation_heatmap.png', dpi=150, bbox_inches='tight') - 方法三:用PyCharm自带的SciView面板显示
想在PyCharm右侧科学计算视图里看图像的话,不需要写TK弹窗逻辑,只要在代码最后调用pyplot的show方法即可——这一步只是触发显示,不会破坏你用面向对象API绘图的逻辑,不会引入pyplot的全局状态问题:# 删掉IPython相关导入和display(fig),最后加这两行 import matplotlib.pyplot as plt plt.show()
注意:原代码里重复的
axs.set_xticklabels(corr.columns)一定要删除,否则x轴标签的旋转、加粗效果会被覆盖,和教程展示的效果不一致。
内容的提问来源于stack exchange,提问作者Clubnub9
相关产品推荐
相关产品推荐

