import matplotlib.pyplot as plt
import numpy as np
def setAxLinesBW(ax):
"""
Take each Line2D in the axes, ax, and convert the line style to be
suitable for black and white viewing.
"""
MARKERSIZE = 3
COLORMAP = {
'b': {'marker': None, 'dash': (None,None)},
'g': {'marker': None, 'dash': [5,5]},
'r': {'marker': None, 'dash': [5,3,1,3]},
'c': {'marker': None, 'dash': [1,3]},
'm': {'marker': None, 'dash': [5,2,5,2,5,10]},
'y': {'marker': None, 'dash': [5,3,1,2,1,10]},
'k': {'marker': 'o', 'dash': (None,None)} #[1,2,1,10]}
}
lines_to_adjust = ax.get_lines()
try:
lines_to_adjust += ax.get_legend().get_lines()
except AttributeError:
pass
for line in lines_to_adjust:
origColor = line.get_color()
line.set_color('black')
line.set_dashes(COLORMAP[origColor]['dash'])
line.set_marker(COLORMAP[origColor]['marker'])
line.set_markersize(MARKERSIZE)
def setFigLinesBW(fig):
"""
Take each axes in the figure, and for each line in the axes, make the
line viewable in black and white.
"""
for ax in fig.get_axes():
setAxLinesBW(ax)
xval = np.arange(100)*.01
fig = plt.figure()
ax = fig.add_subplot(211)
ax.plot(xval,np.cos(2*np.pi*xval))
ax.plot(xval,np.cos(3*np.pi*xval))
ax.plot(xval,np.cos(4*np.pi*xval))
ax.plot(xval,np.cos(5*np.pi*xval))
ax.plot(xval,np.cos(6*np.pi*xval))
ax.plot(xval,np.cos(7*np.pi*xval))
ax.plot(xval,np.cos(8*np.pi*xval))
ax = fig.add_subplot(212)
ax.plot(xval,np.cos(2*np.pi*xval))
ax.plot(xval,np.cos(3*np.pi*xval))
ax.plot(xval,np.cos(4*np.pi*xval))
ax.plot(xval,np.cos(5*np.pi*xval))
ax.plot(xval,np.cos(6*np.pi*xval))
ax.plot(xval,np.cos(7*np.pi*xval))
ax.plot(xval,np.cos(8*np.pi*xval))
fig.savefig("colorDemo.png")
setFigLinesBW(fig)
fig.savefig("bwDemo.png")
字符串 这提供了以下两个图:首先是彩色图:x1c 0d1x然后是黑色和白色图:
您可以调整每种颜色转换为样式的方式。如果您只想使用破折号样式(-. vs. -- vs.任何您想要的图案),请将COLORMAP对应的“标记”值设置为None并调整“破折号”图案,反之亦然。 例如,字典中的最后一个颜色是“k”(黑色);最初我只有一个虚线模式[1,2,1,10],对应于一个显示的像素,两个不显示,一个显示,10个不显示,这是一个点-点-空间模式。然后我注解了它,将破折号设置为(None,None),这是一种非常正式的表示实线的方式,并添加了标记“o”,代表圆形。 我还设置了一个“常量”MARKERSIZE,它将设置每个标记的大小,因为我发现默认的大小有点大。 当你的线已经有一个破折号或标记图案时,这显然不能处理这种情况,但是你可以使用这些例程作为起点来构建一个更复杂的转换器。例如,如果你原来的图有一条红色实线和一条红色虚线,它们都将通过这些例程变成黑色的点划线。当你使用它们时,请记住。
In [3]: plt.rcParams['axes.color_cycle']
/.../__init__.py:892: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.
warnings.warn(self.msg_depr % (key, alt_key))
Out[3]: ['b', 'g', 'r', 'c', 'm', 'y', 'k']
In [4]: from cycler import cycler
In [5]: color_c = cycler('color', ['k'])
In [6]: style_c = cycler('linestyle', ['-', '--', ':', '-.'])
In [7]: markr_c = cycler('marker', ['', '.', 'o'])
In [8]: c_cms = color_c * markr_c * style_c
In [9]: c_csm = color_c * style_c * markr_c
型 这里我们有两个不同的(?)复数cycler,是的,它们是不同的,因为这个运算是非交换的,看一下
In [10]: for d in c_csm: print('\t'.join(d[k] for k in d))
- k
- . k
- o k
-- k
-- . k
-- o k
: k
: . k
: o k
-. k
-. . k
-. o k
In [11]: for d in c_cms: print('\t'.join(d[k] for k in d))
- k
-- k
: k
-. k
- . k
-- . k
: . k
-. . k
- o k
-- o k
: o k
-. o k
In [12]: %matplotlib
Using matplotlib backend: Qt4Agg
In [13]: import numpy as np
In [14]: x = np.linspace(0, 8, 101)
In [15]: y = np.cos(np.arange(7)+x[:,None])
In [16]: plt.rc('axes', prop_cycle=c_cms)
In [17]: plt.plot(x, y);
In [18]: plt.grid();
import pylab as plt
from itertools import cycle
lines = ["k-","k--","k-.","k:"]
linecycler = cycle(lines)
plt.figure()
for i in range(4):
x = range(i,i+10)
plt.plot(range(10),x,next(linecycler))
plt.show()
4条答案
按热度按时间7nbnzgx91#
下面我提供了一些函数来将彩色线转换为具有独特风格的黑线。我的快速测试显示,在7行之后,颜色重复。如果不是这样(我犯了一个错误),那么需要对提供的例程中的“常量”
COLORMAP
进行轻微调整。下面是例程和示例:
字符串
这提供了以下两个图:首先是彩色图:x1c 0d1x然后是黑色和白色图:
您可以调整每种颜色转换为样式的方式。如果您只想使用破折号样式(-. vs. -- vs.任何您想要的图案),请将
COLORMAP
对应的“标记”值设置为None
并调整“破折号”图案,反之亦然。例如,字典中的最后一个颜色是“k”(黑色);最初我只有一个虚线模式
[1,2,1,10]
,对应于一个显示的像素,两个不显示,一个显示,10个不显示,这是一个点-点-空间模式。然后我注解了它,将破折号设置为(None,None),这是一种非常正式的表示实线的方式,并添加了标记“o”,代表圆形。我还设置了一个“常量”MARKERSIZE,它将设置每个标记的大小,因为我发现默认的大小有点大。
当你的线已经有一个破折号或标记图案时,这显然不能处理这种情况,但是你可以使用这些例程作为起点来构建一个更复杂的转换器。例如,如果你原来的图有一条红色实线和一条红色虚线,它们都将通过这些例程变成黑色的点划线。当你使用它们时,请记住。
brc7rcf02#
TL;DR
x1c 0d1x的数据
字符串
扩展应答
较新的
matplotlib
版本引入了新的rcParams
,即axes.prop_cycle
型
对于
plt.style.use(...)
或with plt.style.context(...):
提供的预封装样式,prop_cycle
等效于传统的 * 和已弃用的 *axes.color_cycle
型
但是
cycler
对象有更多的可能性,特别是复杂的cycler
可以由简单的对象组成,涉及不同的属性,使用+
和*
,分别表示压缩和笛卡尔积。在这里,我们导入
cycler
辅助函数,我们定义了3个简单的cycler
,它们引用不同的属性,最后使用笛卡尔积组合它们型
这里我们有两个不同的(?)复数
cycler
,是的,它们是不同的,因为这个运算是非交换的,看一下型
元素周期的变化更快的是最后在产品等,这是很重要的,如果我们想要一定的顺序在造型线。
如何使用
cycler
s的组成?通过plt.rc
的方式,或等效的方式来修改matplotlib
的rcParams
。例如,型
的
当然,这只是一个例子,OP可以混合和匹配不同的属性,以实现最令人愉快的视觉输出。
PS我忘了提一下,这种方法会自动处理图例框中的线样本,
sy5wg1nm3#
我大量使用了Yann的代码,但今天我读到了Can i cycle through line styles in matplotlib的答案,所以现在我将以这种方式绘制BW图:
字符串
的数据
91zkwejq4#
像
plot(x,y,'k-.')
这样的东西会产生黑色('k'
)点虚线('-.'
),这不是你要找的吗?