直方图中的 Matplotlib 2.0 条纹
Matplotlib 2.0 stripes in histogram
使用 matplotlib 2.0.2、python2.7、Win7、64 位创建直方图时,在 bin 之间出现垂直条纹,在创建的 pdf 和 png 中都可见。
我使用 pgf 和 latex 创建一个 PDF,我将在 pdflatex 文档中通过 includegraphics 使用它。创建的 PNG 只是一个快速检查。
在 Matplotlib 1.5.3 中不是这种情况。 如何去掉分隔各个垃圾箱的这些白线?
尝试过的事情:
- 切换抗锯齿on/off(hist命令中的aa=True/False)
- 画一条线(在 hist 命令中 ls="-"/ls="none")
- 一个可行的方法是给容器一个宽度(宽度=2.3),但这也不适用于所有缩放值的 PDF。
生成图像的代码
import matplotlib as mpl
mpl.use('pgf')
pgf_with_latex = { # setup matplotlib to use latex for output
"pgf.texsystem": "pdflatex", # change this if using xetex or lautex
"text.usetex": True, # use LaTeX to write all text
"font.family": "serif",
"font.serif": [], # blank entries should cause plots to inherit fonts from the document
"font.sans-serif": [],
"font.monospace": [],
"axes.labelsize": 10, # LaTeX default is 10pt font.
"font.size": 8,
"legend.fontsize": 7, # Make the legend/label fonts a little smaller
"xtick.labelsize": 7,
"ytick.labelsize": 7,
"pgf.preamble": [
r"\usepackage[utf8x]{inputenc}", # use utf8 fonts becasue your computer can handle it :)
r"\usepackage[T1]{fontenc}", # plots will be generated using this preamble
r"\usepackage{siunitx}",
r"\DeclareSIUnit[number-unit-product = {}] ",
r"\LSB{LSB}",
]
}
mpl.rcParams.update(pgf_with_latex)
import matplotlib.pyplot as pl
import numpy as np
fig=pl.figure(figsize=(3,2))
ax1 = fig.add_subplot(111)
dat=np.random.normal(-120-60,40,200000).astype(int)
bins=np.arange(int(np.amin(dat))-.5,127.5,2)
ax1.hist(dat, bins = bins, stacked = True)
ax1.set_title("\emph{(a)} minimal example")
ax1.set_yscale("log", nonposy="clip")
ax1.set_ylim(0.8, 20000)
ax1.set_xlim(None, 130)
ax1.set_ylabel("frequency")
ax1.set_xlabel("data")
ax1.set_xticks([-300,-200, -127,0,127])
fig.tight_layout(h_pad=1,w_pad=0.2)
pl.savefig('test.png', bbox_inches='tight',dpi=600)
pl.savefig('test.pdf', bbox_inches='tight',dpi=600)
以上代码的输出:
1。不使用 pgf 后端
正如@unutbu 在他的(不幸的是现已删除)回答中指出的那样,不使用 pgf 后端实际上会产生预期的情节。
删除行
mpl.use('pgf')
会给
2。步进函数
如果由于某种原因无法避免使用 pgf 后端,解决方法可能是使用阶梯函数绘制直方图。从代码中删除 ax1.hist(...)
并将其替换为
hist, ex = np.histogram(dat, bins = bins)
ax1.fill_between(bins[:-1], hist, lw=0.0, step="post")
给予
使用 matplotlib 2.0.2、python2.7、Win7、64 位创建直方图时,在 bin 之间出现垂直条纹,在创建的 pdf 和 png 中都可见。 我使用 pgf 和 latex 创建一个 PDF,我将在 pdflatex 文档中通过 includegraphics 使用它。创建的 PNG 只是一个快速检查。
在 Matplotlib 1.5.3 中不是这种情况。 如何去掉分隔各个垃圾箱的这些白线?
尝试过的事情:
- 切换抗锯齿on/off(hist命令中的aa=True/False)
- 画一条线(在 hist 命令中 ls="-"/ls="none")
- 一个可行的方法是给容器一个宽度(宽度=2.3),但这也不适用于所有缩放值的 PDF。
生成图像的代码
import matplotlib as mpl
mpl.use('pgf')
pgf_with_latex = { # setup matplotlib to use latex for output
"pgf.texsystem": "pdflatex", # change this if using xetex or lautex
"text.usetex": True, # use LaTeX to write all text
"font.family": "serif",
"font.serif": [], # blank entries should cause plots to inherit fonts from the document
"font.sans-serif": [],
"font.monospace": [],
"axes.labelsize": 10, # LaTeX default is 10pt font.
"font.size": 8,
"legend.fontsize": 7, # Make the legend/label fonts a little smaller
"xtick.labelsize": 7,
"ytick.labelsize": 7,
"pgf.preamble": [
r"\usepackage[utf8x]{inputenc}", # use utf8 fonts becasue your computer can handle it :)
r"\usepackage[T1]{fontenc}", # plots will be generated using this preamble
r"\usepackage{siunitx}",
r"\DeclareSIUnit[number-unit-product = {}] ",
r"\LSB{LSB}",
]
}
mpl.rcParams.update(pgf_with_latex)
import matplotlib.pyplot as pl
import numpy as np
fig=pl.figure(figsize=(3,2))
ax1 = fig.add_subplot(111)
dat=np.random.normal(-120-60,40,200000).astype(int)
bins=np.arange(int(np.amin(dat))-.5,127.5,2)
ax1.hist(dat, bins = bins, stacked = True)
ax1.set_title("\emph{(a)} minimal example")
ax1.set_yscale("log", nonposy="clip")
ax1.set_ylim(0.8, 20000)
ax1.set_xlim(None, 130)
ax1.set_ylabel("frequency")
ax1.set_xlabel("data")
ax1.set_xticks([-300,-200, -127,0,127])
fig.tight_layout(h_pad=1,w_pad=0.2)
pl.savefig('test.png', bbox_inches='tight',dpi=600)
pl.savefig('test.pdf', bbox_inches='tight',dpi=600)
以上代码的输出:
1。不使用 pgf 后端
正如@unutbu 在他的(不幸的是现已删除)回答中指出的那样,不使用 pgf 后端实际上会产生预期的情节。
删除行
mpl.use('pgf')
会给
2。步进函数
如果由于某种原因无法避免使用 pgf 后端,解决方法可能是使用阶梯函数绘制直方图。从代码中删除 ax1.hist(...)
并将其替换为
hist, ex = np.histogram(dat, bins = bins)
ax1.fill_between(bins[:-1], hist, lw=0.0, step="post")
给予