我想在轴上有粗体标签,这样我就可以使用该图进行发布。我还需要将图例中的线条标签以粗体绘制。 到目前为止,我可以将轴标签和图例设置为我想要的尺寸和重量。我还可以将轴标签的大小设置为我想要的大小,但是我在重量方面失败了。
这是示例代码:
# plotting libs
from pylab import *
from matplotlib import rc
if __name__=='__main__':
tmpData = np.random.random( 100 )
# activate latex text rendering
rc('text', usetex=True)
rc('axes', linewidth=2)
rc('font', weight='bold')
#create figure
f = figure(figsize=(10,10))
ax = gca()
plot(np.arange(100), tmpData, label=r'\textbf{Line 1}', linewidth=2)
ylabel(r'\textbf{Y-AXIS}', fontsize=20)
xlabel(r'\textbf{X-AXIS}', fontsize=20)
fontsize = 20
fontweight = 'bold'
fontproperties = {'family':'sans-serif','sans-serif':['Helvetica'],'weight' : fontweight, 'size' : fontsize}
ax.set_xticklabels(ax.get_xticks(), fontproperties)
ax.set_yticklabels(ax.get_yticks(), fontproperties)
for tick in ax.xaxis.get_major_ticks():
tick.label1.set_fontsize(fontsize)
for tick in ax.yaxis.get_major_ticks():
tick.label1.set_fontsize(fontsize)
legend()
show()
sys.exit()
这就是我得到的:
知道我遗漏了什么或做错了什么才能使轴刻度标签显示为粗体吗?
编辑
我已经使用汤姆斯响应更新了我的代码。但是我现在有另一个问题,因为我需要在 x 轴上使用
datetime
,这与正常 y 轴上的效果不同(抱歉没有将其放入原始问题中,但我没有认为这会改变事情):
# plotting libs
from pylab import *
from matplotlib import rc, rcParams
import matplotlib.dates as dates
# datetime
import datetime
if __name__=='__main__':
tmpData = np.random.random( 100 )
base = datetime.datetime(2000, 1, 1)
arr = np.array([base + datetime.timedelta(days=i) for i in xrange(100)])
# activate latex text rendering
rc('text', usetex=True)
rc('axes', linewidth=2)
rc('font', weight='bold')
rcParams['text.latex.preamble'] = [r'\usepackage{sfmath} \boldmath']
#create figure
f = figure(figsize=(10,10))
ax = gca()
plot(np.arange(100), tmpData, label=r'\textbf{Line 1}', linewidth=2)
ylabel(r'\textbf{Y-AXIS}', fontsize=20)
xlabel(r'\textbf{X-AXIS}', fontsize=20)
ax.xaxis.set_tick_params(labelsize=20)
ax.yaxis.set_tick_params(labelsize=20)
ax.xaxis.set_major_formatter(dates.DateFormatter('%m/%Y'))
ax.xaxis.set_major_locator(dates.MonthLocator(interval=1))
legend()
现在我的结果如下所示:
这些更改似乎不会影响显示,也不会影响 x 轴刻度标签的权重。
使用
plt.xticks(x, weight = 'bold')
我认为问题是因为刻度是在 LaTeX 数学模式下制作的,所以字体属性不适用。
您可以使用
rcParams
将正确的命令添加到 LaTeX 序言中来解决此问题。具体来说,您需要使用 oldmath 来获得正确的粗细,并使用 \usepackage{sfmath} 来获得无衬线字体。
此外,您还可以使用
set_tick_params
设置刻度标签的字体大小。
这里有一些代码可以实现您想要的功能:
import numpy as np
from matplotlib import rc,rcParams
from pylab import *
tmpData = np.random.random( 100 )
# activate latex text rendering
rc('text', usetex=True)
rc('axes', linewidth=2)
rc('font', weight='bold')
rcParams['text.latex.preamble'] = [r'\usepackage{sfmath} \boldmath']
#create figure
f = figure(figsize=(10,10))
ax = gca()
plot(np.arange(100), tmpData, label=r'\textbf{Line 1}', linewidth=2)
ylabel(r'\textbf{Y-AXIS}', fontsize=20)
xlabel(r'\textbf{X-AXIS}', fontsize=20)
ax.xaxis.set_tick_params(labelsize=20)
ax.yaxis.set_tick_params(labelsize=20)
legend()
labels = axes.get_xticklabels() + axes.get_yticklabels()
[label.set_fontweight('bold') for label in labels]
这是你的另一个例子
import matplotlib.pyplot as plt
places = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
literacy_rate = [100, 98, 90, 85, 75, 50, 30, 45, 65, 70]
female_literacy = [95, 100, 50, 60, 85, 80, 75, 99, 70, 30]
plt.xlabel("Places")
plt.ylabel("Percentage")
plt.plot(places, literacy_rate, color='blue',
linewidth=6, label="Literacy rate")
plt.plot(places, female_literacy, color='fuchsia',
linewidth=4, label="Female Literacy rate")
plt.legend(loc='lower left', ncol=1)
y 输出将如下所示:
[fr'\textbf{{{v}}}' for v in ax.get_xticks()]
使用 3 组 {}
,因为还使用了 f 弦。
{}
,fr'\textbf{v}'
,则只有第一个字符会加粗。Axes
接口。如果使用隐式 pyplot
接口,则在绘图调用后使用 Axes
获取 ax = plt.gca()
。import matplotlib.pyplot as plt
import numpy as np
data = np.random.random(100)
# activate latex text rendering
plt.rc('text', usetex=True)
plt.rc('axes', linewidth=2)
plt.rc('font', weight='bold')
# create figure and Axes
fig, ax = plt.subplots(figsize=(10, 10))
ax.plot(np.arange(100), data, label=r'\textbf{Line 1}', linewidth=2)
# Set the axis labels to bold and increase the fontsize
ax.set_ylabel(r'\textbf{Y-AXIS}', fontsize=20)
ax.set_xlabel(r'\textbf{X-AXIS}', fontsize=20)
# change the tick labels to bold
ax.set_xticks(ax.get_xticks(), [fr'\textbf{{{v}}}' for v in ax.get_xticks()], fontsize=20)
_ = ax.set_yticks(ax.get_yticks(), [fr'\textbf{{{round(v, 1)}}}' for v in ax.get_yticks()], fontsize=20)
如果您想让轴标签自动加粗(即不必每次都添加 extbf),您可以执行以下操作
from matplotlib.axes import Axes
from matplotlib import pyplot as plt
plt.rcParams['text.usetex'] = True
def get_new_func(axis_name): # returns a modified version of the Axes.set_xlabel (or y) methods
orig_func = getattr(Axes, f'set_{axis_name}label')
def add_bold(self, *args, **kwargs):
new_args = list(args)
new_args[0] = fr"\textbf{{{new_args[0]}}}" # modify the argument
return orig_func(self, *new_args, **kwargs)
return add_bold
for x in ['x', 'y']:
setattr(Axes, f'set_{x}label', get_new_func(x)) # modify the methods of the Axis class
x = np.linspace(0, 2 * 3.14, 20)
y = np.sin(x)
ax = plt.gca()
ax.plot(x, y)
ax.set_xlabel("Theta")
ax.set_ylabel("Amp")
plt.show()
这利用了以下事实:
Axis.set_xlabel
和 Axis.set_ylabel
方法是可由用户修改的属性(在本例中为函数对象)。修改是在 add_bold
中完成的,它只是调用原始函数对象,但使用修改后的参数。 orig_func
和 add_bold
在 get_new_func
内部定义,以便正确保留对原始方法的引用(即我正在形成一个闭包)。