关于matplotlib的后端(Backend)_GG的专栏-CSDN博客 20180915
matplotlib绘图进阶_皮皮blog-CSDN博客 20140714
PyCharm使用远程Python解释器并用matplotlib绘图的方法 - 简书 20171120
远程服务器的GUI显示到本地及Pycharm配置 - 简书 20180929
pycharm 远程显示 matplotlib - 简书 20190303
问题描述: 在使用pycocotools接口时,使用matplotlib显示图片出现了以下问题:
import numpy as np
from PIL import Image
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
from pycocotools.coco import COCO
path_to_fruits = "fruits.jpg"
img_fruits = mpimg.imread(path_to_fruits)
plt.imshow(img_fruits)
plt.show()
E:\OtherProgramFiles\Anaconda3\envs\my_gpu_py3\python.exe E:/WorkSpace/Dataset/MyCondaProject004_pycocotools/cy_learn_coco.py
E:/WorkSpace/Dataset/MyCondaProject004_pycocotools/cy_learn_coco.py:31: UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.
plt.show()
Process finished with exit code 0
原因分析与解决方案:经排查,将上述程序段的from pycocotools.coco import COCO
注释掉就不会报错,后来发现这是由于安装的pycocotools中E:/OtherProgramFiles/Anaconda3/envs/my_gpu_py3/lib/site-packages/pycocotools/coco.py脚本文件中有这么一句; matplotlib.use('Agg')
, 将该句注释掉即可正常显示图片啦。
(未阅读) python - “UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.” when plotting figure with pyplot on Pycharm - Stack Overflow
- | - | - |
---|---|---|
人类 | 画板 | 调色板 |
Matplotlib | FigureCanvas | Renderer |
Matplotlib 总体来说,它包含两类元素:
我们可以在四个容器元素上面添加各种基础元素,比如:
Tutorials — Matplotlib 3.3.2 documentation | Introductory | Usage Guide
散点图 (scatter chart) 用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种联系的分布模式。
饼状图 (pie chart) 是一个划分为几个扇形的圆形统计图表,用于描述量、频率或百分比之间的相对关系。
设定mask的颜色darkorange:'#FF8C00':(255,140,0);
设定point的颜色
blue:'#0000FF':(0,0,255);
green:'#008000':(0,128,0);
purple:'#800080':(128,0,128);
black:'#000000':(0,0,0);
white:'#FFFFFF':(255,255,255);
lime:'#00FF00':(0,255,0);
yellow:'#FFFF00':(255,255,0);
cyan:'#00FFFF':(255,255,0);
red:'#FF0000':(0,0,255);
使用 plt.rcParams
命令可以查看图的所有默认属性。
推荐方法1:同时生成图和坐标系
fig, ax = plt.subplots() # 默认得到的axes是一个1×1的对象
ax.set(xticks=[], yticks=[])
# tmp_x = range(0, 6)
# tmp_y = np.array([1.1, 1.5, 1.4, 1.5, 1.6, 1.8])
# ax.plot(tmp_x, tmp_y)
ax.text(0.5, 0.5, 'Style 1\n\nfig, ax = plt.subplots()\nax.plot()', ha='center', va='center', size=16, alpha=.5)
plt.show()
fig, axes = plt.subplots(nrows=2, ncols=2) # 得到的axes是一个2×2的对象
for i, ax in enumerate(axes.flat):
ax.set(xticks=[], yticks=[])
s = 'Style 1\n\n' + 'subplot(2,2,' + str(i) + ')'
ax.text(0.5, 0.5, s, ha='center', va='center', size=16, alpha=.5)
plt.tight_layout()
plt.show()
fig = plt.figure() # 生成图 (figure)
ax = fig.add_subplot(1, 1, 1) # 添加坐标系 (axes); 子图是坐标系的特例
tmp_x = range(0, 6)
tmp_y = np.array([1.1, 1.5, 1.4, 1.5, 1.6, 1.8])
ax.plot(tmp_x, tmp_y)
# ax.set(xticks=[], yticks=[])
s = 'Style 2\n\nfig = plt.figure()\nax = fig.add_subplot(1, 1, 1)\nax.plot()'
ax.text(0.5, 0.5, s, ha='center', va='center', size=16, alpha=.5, transform=ax.transAxes)
plt.show()
其它方法1:生成图 (figure)
plt.figure() # 生成图 (figure)
plt.text(0.5, 0.5, 'Style other1\n\nplt.figure()', ha='center', va='center', size=16, alpha=.5)
plt.xticks([]), plt.yticks([])
plt.show()
其它方法2:直接生成子图
plt.subplot(1, 1, 1) # 直接生成子图
plt.xticks([]), plt.yticks([])
plt.text(0.5, 0.5, 'Style other2\n\nplt.subplot(1, 1, 1)', ha='center', va='center', size=16, alpha=.5)
plt.show()
其它方法3:直接生成坐标系
plt.axes([0.1, 0.1, 0.5, 0.5]) # 直接生成坐标系 plt.axes([l1, b1, w1, h1])
plt.xticks([]), plt.yticks([])
plt.text(0.1, 0.1, 'Style other3\naxes1', ha='left', va='center', size=16, alpha=.5)
plt.axes([0.2, 0.2, 0.5, 0.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1, 0.1, 'Style other3\naxes2', ha='left', va='center', size=16, alpha=.5)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(3)
tmp_num = 100
tmp_x = range(0, tmp_num)
tmp_y1 = np.random.rand(tmp_num)
tmp_y2 = np.random.rand(tmp_num) * 4
tmp_y3 = np.random.rand(tmp_num) * 2
plt.figure(figsize=(12, 6), dpi=100)
# subplot 1
plt.subplot(3, 1, 1)
plt.plot(tmp_y1, color='b', linewidth=2.0, linestyle='--', label='tmp_y1')
plt.plot([tmp_x[0], tmp_x[-1]], [0.7, 0.7], color='y', linewidth=1.0, linestyle=':', ) # 画一条直线
plt.xlim(-1, len(tmp_x) + 1)
plt.ylim(tmp_y1.min() * 0.8, tmp_y1.max() * 1.2)
_x_tick = range(0, len(tmp_x), 10)
_x_label = ["{}th a".format(i) for i in _x_tick]
plt.xticks(_x_tick, _x_label, rotation=90) # 调整x轴刻度
plt.xlabel('tmp_x')
plt.ylabel('tmp_y1')
plt.legend(loc='upper left', frameon=True) # 显示图例; 图例名称由plt.plot()中的参数label设置;
# subplot 2
plt.subplot(3, 1, 2)
plt.scatter(tmp_x, tmp_y2, c='y', marker='*', alpha=0.5, label='tmp_y2')
plt.xlim(-1, len(tmp_x) + 1)
plt.ylim(tmp_y2.min() * 0.8, tmp_y2.max() * 1.2)
_x_tick = range(0, len(tmp_x), 10)
_x_label = ["{}th a".format(i) for i in _x_tick]
plt.xticks(_x_tick, _x_label, rotation=90)
plt.xlabel('tmp_x')
plt.ylabel('tmp_y2')
plt.legend(loc='upper right', frameon=True)
# subplot 2
plt.subplot(3, 1, 3)
plt.scatter(tmp_x, tmp_y3, c='b', marker='+', alpha=0.5, label='tmp_y3')
plt.xlim(-1, len(tmp_x) + 1)
plt.ylim(tmp_y3.min() * 0.8, tmp_y3.max() * 1.2)
_x_tick = range(0, len(tmp_x), 10)
_x_label = ["{}th a".format(i) for i in _x_tick]
plt.xticks(_x_tick, _x_label, rotation=90)
plt.xlabel('tmp_x')
plt.ylabel('tmp_y3')
plt.legend(loc='upper right', frameon=True)
# plt.grid(True) # 显示网格线
plt.tight_layout()
plt.show()
# print(plt.rcParams)
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
# matplotlib inline 就是在 Jupyter Notebook 里面内嵌画图的
# flag_1 = True
flag_1 = False
if flag_1:
# Matplotlib.pdf | 1.1 概览
tmp_fig = plt.figure() # 图 (figure)
tmp_axes = tmp_fig.add_subplot(1, 1, 1) # 坐标系 (axes); 子图是坐标系的特例
plt.show()
tmp_x_axis = tmp_axes.xaxis # 坐标轴 (axis)
tmp_y_axis = tmp_axes.yaxis
print('tmp_fig.axes:', tmp_fig.axes, '\n')
print('tmp_axes.xaxis:', tmp_x_axis)
print('tmp_axes.yaxis:', tmp_y_axis, '\n')
print('tmp_axes.xaxis.majorTicks:', tmp_x_axis.majorTicks) # 刻度 (tick)
print('tmp_axes.yaxis.majorTicks:', tmp_y_axis.majorTicks, '\n')
print('tmp_axes.xaxis.minorTicks:', tmp_x_axis.minorTicks)
print('tmp_axes.yaxis.minorTicks:', tmp_y_axis.minorTicks, '\n')
# 由坐标系和坐标轴指向同一个图 (侧面验证了图、坐标系和坐标轴的层级性)
print('tmp_axes.figure:', tmp_axes.figure)
print('tmp_x_axis.figure:', tmp_x_axis.figure)
print('tmp_y_axis.figure:', tmp_y_axis.figure)
# flag_2 = True
flag_2 = False
if flag_2:
# Matplotlib.pdf | 1.5 刻度 | 刻度展示
tmp_fig = plt.figure()
tmp_axes = tmp_fig.add_subplot(1, 1, 1)
tmp_axes.set_xlim(10**3, 10**10)
tmp_axes.set_xscale('log')
# 设置numticks=15时, 这里显示了8个刻度; 如果设置的numticks少于实际所需的刻度数目, 例如设置成6时, 则这里只会显示5个刻度;
tmp_axes.xaxis.set_major_locator(ticker.LogLocator(base=10.0, numticks=15))
tmp_axes.text(0.0, 0.1, "LogLocator(base=10.0, numticks=15)", fontsize=14, transform=tmp_axes.transAxes)
# tmp_axes.patch.set_color('black')
# tmp_axes.patch.set_alpha(0.15)
plt.show()
# Matplotlib.pdf | 3.1 概览
from yahoofinancials import YahooFinancials
import pandas as pd
def data_converter(price_data, code, asset):
# convert raw data to dataframe
if asset == 'FX':
code = str(code[3:] if code[:3]=='USD' else code) + '=X'
columns = ['open', 'close', 'low', 'high']
price_dict = price_data[code]['prices']
index = [p['formatted_date'] for p in price_dict] # 用列表解析式将日期获取出来
price = [[p[c] for c in columns] for p in price_dict] # 用列表解析式将价格获取出来
data = pd.DataFrame(price, index=pd.Index(index, name='date'), columns=pd.Index(columns, name='OHLC'))
return data
start_date = '2018-04-29'
end_date = '2019-04-29'
stock_code = ['NVDA', 'AMZN', 'BABA', 'FB', 'AAPL'] # 股票
currency_code = ['EURUSD=X', 'JPY=X', 'CNY=X'] # 汇率
stock = YahooFinancials(stock_code)
currency = YahooFinancials(currency_code)
stock_daily = stock.get_historical_price_data(start_date, end_date, 'daily')
currency_daily = currency.get_historical_price_data(start_date, end_date, 'daily')
# print('stock_daily的值\n', stock_daily, '\n')
# print('currency_daily的值\n', currency_daily, '\n')
NVDA = data_converter(stock_daily, 'NVDA', 'EQ')
print('NVDA.head(3).append(NVDA.tail(3))的值\n',NVDA.head(3).append(NVDA.tail(3)), '\n')
EURUSD = data_converter(currency_daily, 'EURUSD', 'FX')
print('EURUSD.head(3).append(EURUSD.tail(3))的值\n', EURUSD.head(3).append(EURUSD.tail(3)), '\n')
方法一(报错了):通过使用字体管理器font_manager
from matplotlib import font_manager # 导入字体管理器
my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\MSYHBD.ttc", size=15) # 微软雅黑
E:\OtherProgramFiles\Anaconda3\envs\my_gpu_py3\lib\site-packages\matplotlib\backends\backend_agg.py:238: RuntimeWarning: Glyph 26102 missing from current font.
font.set_text(s, 0.0, flags=flags)
方法二:通过在代码中动态设置中文字体
import pylab
# 设置汉字格式; sans-serif就是无衬线字体, 是一种通用字体族;
# 常见的无衬线字体有 Trebuchet MS, Tahoma, Verdana, Arial, Helvetica, SimHei, 中文的幼圆, 隶书等等;
pylab.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
pylab.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
tikzplotlib · PyPI
This is tikzplotlib, a Python tool for converting matplotlib figures into PGFPlots (PGF/TikZ) figures like for native inclusion into LaTeX or ConTeXt documents.
matplotlib绘图的两种模式“block”和“interactive” - 简书 20180927
block模式特点:
(1)plt.polt()
等绘图函数不会直接在窗口中绘图,只有调用plt.show()
(窗口不会自动关闭)或plt.pause()
(窗口自动关闭)时才将内存中的图绘制到窗口;
(2)程序碰到第一个plt.show()
时,绘图后会暂停执行,直到手动关闭当前窗口才继续执行后面的代码,这就是“阻塞”的含义;
(3)plt.pause(time)
函数也能实现窗口绘图(不需要plt.show
),但窗口只停留 time 时间便会自动关闭,然后再继续执行后面代码;plt.pause()
会把它之前的所有绘图都绘制在对应坐标系中,而不仅仅是在当前坐标系中绘图;特别要注意的是,plt.pasue(0)
将绘制之前的所有图像,且图像窗口不会自动关闭,但程序会停止在该语句所在位置,即使手动关闭窗口也不会继续执行后面的代码;
(4)如果plt.pause()
和plt.show()
一起使用时,前者相当于只是暂停时间,而在窗口中绘图的工作将由plt.show()
完成,因此后者的总用占主要位置;
(5)在Python脚本中默认是block模式的。
interactive模式特点:
(1)开启interactive模式,用plt.ion()
,放在绘图之前,关闭该模式用plt.ioff()
;
(2)不用plt.show()
或plt.pause()
,只要plt.plot()
等语句就能在窗口中绘图,但是,绘图后窗口立马自动关闭,你压根都没法看清楚;可以用plt.pause(time)
进行延迟自动关闭时间,需要注意的是如果有多个plt.pause()
穿插在不同绘图函数下,那么前面的窗口不会先关闭,会等到最后一个plt.pause()
结束后再一起关闭。该模式下要实现同时绘图,且保持,可用plt.pause(0)
,但程序会结束在该位置,手动关闭窗口也不会继续执行了,因此plt.pause(0)
应放在程序最后。
(3)该模式下,即使用了plt.show()
也依然会自动关闭窗口,可在调用plt.show()
之前调用plt.ioff()
关闭交互模式,恢复到阻塞模式。
(4)iPython环境下默认是interactive模式。
20230412记:把直方图的纵轴由概率密度改为概率;
谷歌检索"python plt.hist probability display",必应检索"python 直方图 频率";
谷歌检索"Matplotlib histogram probability"“Matplotlib bins probability”“sns.histplot bins”;
20230412记:plt.hist
的返回值的含义:
import matplotlib.pyplot as plt
data = [8, 8, 9, 12, 13, 13, 14, 14, 15, 18, 22, 23, 24, 25, 30]
plt.figure(figsize=(8,8))
plt.subplot(221)
tmp1 = plt.hist(data, bins=4, edgecolor='black')
plt.subplot(222)
tmp2 = plt.hist(data, bins=4, density=True, edgecolor='black')
# tmp1[0]/(sum(tmp1[0])*np.diff(tmp1[1])) 的值与 tmp2[0] 的值相等
>>> tmp1
(array([6., 4., 3., 2.]), array([ 8. , 13.5, 19. , 24.5, 30. ]), )
>>> tmp2
(array([0.07272727, 0.04848485, 0.03636364, 0.02424242]), array([ 8. , 13.5, 19. , 24.5, 30. ]), )
>>> import numpy as np
>>> tmp1[0]/(sum(tmp1[0])*np.diff(tmp1[1]))
array([0.07272727, 0.04848485, 0.03636364, 0.02424242])
import seaborn as sns
plt.subplot(223)
sns.histplot(data=data, stat='probability', bins=[8, 13.5, 19, 24.5])
plt.subplot(224)
sns.histplot(data=data, stat='probability', bins=[8, 13.5, 19, 24.5, 30])
plt.show()
问题描述:
有两个 y 轴, 如何对齐它们 at y=0 ?
原因分析and解决方案:
暂未亲测;
问题描述:
坐标轴的左下角(0.,0.)与图的左下角对齐;
原因分析and解决方案:
The axis
function in the example plt.axis([0, 6, 0, 20])
takes a list of [xmin, xmax, ymin, ymax]
and specifies the viewport of the axes.
问题描述:
给定 y 值, 从曲线中索引出相应的 x 值;
原因分析and解决方案:
use the interp function from numpy library,
import numpy as np
x = [0.01474926, 0.96923077, 1]
y = [1, 0.7875, 0]
np.interp(0.75, x,y)
0.8363082148652623
问题描述:
20230326记:绘制多条曲线时,Matplotlib会自动为不同的曲线分配不同的颜色,那么如何手动地调出下一条曲线的颜色呢?
解决方案:
例如,
df = pd.read_csv('data.csv')
plt_tmp = df.plot(**kwargs) # 这里, `plt_tmp`为一个`matplotlib.axes.Axes`实例;
plt.scatter(x, y, c=next(plt_tmp.axes._get_lines.prop_cycler)['color'], marker="o", label='y1')
Styling with cycler — Matplotlib 3.7.1 documentation
Demo of custom property-cycle settings to control colors and other style properties for multi-line plots.
自定义属性周期设置,可以控制多线图的颜色和其他样式属性。
matplotlib.axes.Axes.set_prop_cycle — Matplotlib 3.7.1 documentation
Axes.set_prop_cycle(*args, **kwargs)
Set the property cycle of the Axes.
The property cycle controls the style properties such as color, marker and linestyle of future plot commands. The style properties of data already added to the Axes are not modified.
matplotlib.axes.Axes.plot — Matplotlib 3.7.1 documentation
By default, each line is assigned a different style specified by a ‘style cycle’.
Alternatively, you can also change the style cycle usingrcParams["axes.prop_cycle"]
(default:cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])
).
问题描述:
20230327记:在远程服务器上通过 Matplotlib 画图时报错:_tkinter.TclError: no display name and no $DISPLAY environment variable
。
原因分析and解决方案:
数学公式粗体 \textbf{} 或者 m e m o r y {\bf memory} memory
数学公式粗斜体 \bm{}
摘录自“bookname_author”
此文系转载,原文链接:名称 20200505
高亮颜色说明:突出重点
个人觉得,:待核准个人观点是否有误
分割线
分割线
问题描述:
原因分析:
解决方案: