整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

dedecms织梦文章列表页隔行换色/分组加线




梦dedecms列表页在文章列表上可能会有很多的样式设置,但是如果是一个个性的网站,这里给大家介绍一个新的方法,就是隔行换色和分组加线。
打开:inc_channel_unit_functions.php
加入下面一段

//zouql

//$f 列表总数

//$t 每组列表数

function MyList($f,$t,$meid,$con)

{

if($meid%$t ==0 && $meid < $f)

return $con;

}


例子:

<ul>

{dede:arclist row=20 titlelen=80 orderby=pubdate}

<li [field:global name=autoindex function='MyList("20","2",@me,"class=\"color\"")'/]>[field:textlink/]</li>

[field:global name=autoindex function='MyList("20","5",@me,"<li class=\"line\"></li>")'/]

{/dede:arclist}

</ul>


上面例子中包含了2个用法:[field:global name=autoindex function='MyList("20","2",@me,"class=\"color\"")'/]和[field:global name=autoindex function='MyList("20","5",@me,"<li class=\"line\"></li>")'/]第一个,如果你定义了相关css,就是隔行变色第二个,如果你定义了相关css,就是隔5行加一横线,20个列表加3个线不是4个

三生绳一般都是情侣佩戴,寓意有三生三世,永结同心之说。编法不复杂,佩戴效果简约大方。

那今天我们来学习三生绳的编法。

三生绳情侣佩戴的多用红色,本命年的也同样适用红色,当然有些男孩子不喜欢红色的也可以换成其他颜色来编,它所赋予的寓意都是一样的。

用红色的来做个步骤图。

需要的是玉线,6根,长度约80厘米。用72号线或者12号股线也是一样的,步骤也是一样的。

选取其中三条线,对折,扭线,也就是做成两股辫,长度约2.5厘米,对折,整理下,打蛇结。扣眼做成。

因为是要三条,所以我们把六条线分为三份,捋顺,取旁边的两根。

加上一条对折的玉线,其余四根线暂时往上放,或者用夹子固定住。

开始编四股辫。

蛇结固定,这里说明下,这个蛇结稍后要拆开的,所以宽送一点,确保四股辫的结尾不会散开即可。

把已经编好的四股辫放上去,换第二组的两根线下来,同样也要编四股辫。

先加上对折的一条线,共四条线。

开始编四股辫。

第二根结束。

那么你们应该也猜到了,第三组同样也是如上的步骤。

先加线。

编四股辫。三组全部编完了。

毫无悬念,编绳其实只要有编绳基础,加上一懂步骤,那么就很轻松的上手了,没什么诀窍,关键在于练习。

三个蛇结都是比较宽松的,三组四股辫对齐以后就要拆除了。

对齐后取十二条线中较长的一根,绕住全部的线,最后一圈的时候就圈把线穿过,拉紧,剪去多余的,留下约两厘米的线头,火烧固定。


剪去其中位置靠中间的七根线,烧头,余下的四根线打蛇结,把烧头的位置藏住。

再剪去中间的两根线,烧头,余下的两根线打蛇结,把这个的痕迹包住。

余下的两根线合并一起,烧细拉长,穿过一个平安扣。

这里插一个诀窍,平安扣如果打结的话,烧头之后结会鼓出来,不是很美观,那么我们就不打结,只需要留出一段大学三厘米的线。

直接把线头烧融化,往平安扣面轻轻按一下,就可以形成一个固定住平安扣的点了。这个除非线留短了,否则都会卡得很结实,不会脱落的。

平安扣穿过扣眼。整个编法的步骤就完成了。

如果看不明白有任何问题的欢迎留言,看到会回复哒。

欢迎点赞给我加油,会努力更新,谢谢。

表元素调校

一张可视化图上除了主要的点、线、面之外,文本标签、坐标轴标签等也是很重要的可视媒介,特别是对于信息图表而言。 下面这张图基本囊括了用到的图形元素。

figure上的图元

加文本可以通过 ax.text(x,y, "Text") 。添加标题通常写ax.set_title(),另外也可以用ax.title.set_text('title')或ax.set(title='ttl')设置标题, 整理如下:

  • ax.text(x,y, "Text"):在坐标[x,y]处添加文本Text,文本支持latex公式,如ax.text(2,6, r'$E=mc^2$', fontsize=15);
  • ax.set_title():添加标题;
  • ax.set_ylim(0,4) 设置y轴值的范围(类似于函数的值域),例如对于y=[],直接ax.plot(y)画出来的折线图y轴范围是 ,通过ax.set_ylim(0,4) 可以显示0~100范围的效果。同理通过ax.set_ylim(0,4)设置x轴范围(定义域);
  • ax.set_ylabel("Y axis label"):给y轴加上坐标轴标题;
  • ax.tick_params(which='major', width=1.0):细调坐标轴刻度;
  • ax.legend() : 设置图例 ;


常用图表标签添加的接口

图形元素设置除了文本类型之外,也可以往里加形状 。

  • 加线:import matplotlib.lines as lines;ax.add_artist(lines.Line2D([15,15], [0, 10],color='#1EAFAE')),其效果可参考矩阵图绘制效果;
  • 加带箭头的线: ax.arrow(0, 0, 0.5, 0.5, head_width=0.05, head_length=0.1, fc='k', ec='k');
  • 加一个垂直的平均线: ax.axvline(x, ls='--', color='r'),那水平平均线呢?axhline(y=0, xmin=0, xmax=1, **kwargs);
  • 加垂直或水平的强调矩形: ax.axhspan(ymin, ymax, xmin=0, xmax=1, **kwargs) 和 ax.axvspan(xmin, xmax, ymin=0, ymax=1, **kwargs);
  • 加矩形:patches.append(mpatches.Rectangle([0.5, 0.5], 0.5,0.8)),可用于绘制甘特图;
  • 加圆形(及椭圆): patches.append( mpatches.Ellipse((x,y), width, height));
  • 加带箭头的形状:ax.annotate('箭头文本', xy=(4,5), xytext=(3,2),color, arrowprops=dict( arrowstyle='->', connectionstyle="arc3")),加图标型的箭头:patches.append( mpatches.Arrow(x,y, dx,dy,width));
  • 加图片: mpimg.imread(ipath); ax.axis('off'); ax.imshow(img);

给散点图加标签并加分隔线绘制矩阵图以实践一下以上方法:

import matplotlib.lines as lines
fig, ax= plt.subplots()
ax.plot(df['z'],df['y'],'o')
ax.add_artist(lines.Line2D([70,70], [30,100],color='#000000',lw=3)) #是[x1,x2],[y1,y2] 不是[x1,y1],[x2,y2]
ax.add_artist(lines.Line2D([30,100], [65,65],color='#000000',lw=3))
ax.set_xlim(30,100)
ax.set_ylim(30,100)
ax.set_xlabel("z")
ax.set_ylabel("y")


矩阵图绘制示例

绘制瀑布图综合运用ax.bar()的参数和文本标签,并封装为一个函数,以后使用只需要调用就好:


Matplotlib绘制瀑布图示例


#瀑布图
x=[17,-3,7,6] #原始数据
def waterfall_chart(x):
    j=0 #sum(x) 最终柱的结果
    k=0 #k=x[i-1]
    x0=[]
    for i in x:
        if i<0:
            x0.append(j+i)
        else:
            x0.append(j)
        j+=i
    x1=[abs(i) for i in x]
    c1=['#1EAFAE' if i>0 else '#69FFFF' for i in x]
    c1.append('#BA5C25')
    x0[0]=0
    x0.append(0)
    x1.append(j)
    x.append(j)
    w=list(range(1,len(x)+1))
    fig,ax= plt.subplots(figsize=(6,5))
    ax.bar(w,x0,alpha=0) #都透明度为0了,颜色不重要
    rects=ax.bar(w,x1,bottom=x0,color=c1) #颜色可传一个数组的
    ax.set_ylim(0, 30)
    i=0
    for rect in rects: #加上适当的文本标签 
        height = rect.get_height()+x0[i]
        ax.annotate('{}'.format(x[i]),
                xy=(rect.get_x() + rect.get_width() / 2, height),
                xytext=(0,1),  # 1 points vertical offset
                textcoords="offset points",
                ha='center', va='bottom')
        i+=1
    ax.set_xticklabels(['','Q1','Q2','Q3','Q4','Ys'])
    return ax
waterfall_chart(x)

组合图

为了更好地展现数据间的联系或变化,我们有时会需要将多种图表类型用在同一张可视化图里,一种是共用坐标轴的组合图,例如面积图+柱状图的组合、散点+折线图就是很基础的组合图。另一种是双坐标轴,很常见的图是左边的y轴是月活,画柱状图,右边的y轴是增长率,画折线图。



棒棒糖图(Lollipop)是将条形图的柱变得很细并突出末端的一类图,形似棒棒糖,特别适合于展示分类标签很多的数据。可以通过将柱状图和散点图结合的方法绘制,Matplotlib库绘制起来并不复杂,代码如下。但对于一些散点图的y轴不支持分类标签的库来说,要画棒棒糖图还是挺复杂的。

y = [5, 4, 11, 10, 15, 11, 13, 8,13,15,13,19]
x=['c'+str(i) for i in range(len(y))]

fig, ax= plt.subplots(figsize=(6,6)) 
ax.barh(x,y,height=0.08,zorder=1) #图层顺序的解决方案
ax.scatter(y,x,zorder=2,color='#ba5c25')

有时为了对比两类数据,除了用簇状柱形图或簇状条形图外,也可以试试哑铃图,理解了上面画棒棒糖图的方法之后,要组合出哑铃图并不难,对数据进行一定运算后用barh加两个scatter就可以画出来。



帕累托图是双坐标轴的可视化典例。帕累托图特别适合展示符合长尾效应的数据。matplotlib给我们提供了ax.twinx()用于生成共用x轴的另一个Axes,效果就是左边的y轴比例尺和右边比例尺不一定一样,能更好地将两类图进行效果组合。

y=[23,162,51,119,12,3,8] #模拟数据
x=[str(i) for i in range(2,len(y)+2)]
y=sorted(y,reverse=True)
ysum=sum(y)
y2=[]
cc=0
for i in y:
    cc+=i
    y2.append(cc/ysum*100)
fig = plt.figure()
ax1 = fig.add_subplot(111)
rects=ax1.bar(x,y,color='#1EAFAE')
ax1.set_ylabel('Month IC')
ax1.set_ylim(0, 180)
ax2 = ax1.twinx() 
#https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.twinx.html#matplotlib.axes.Axes.twinx
ax2.set_ylim(0, 100)
​
ax2.plot(x, y2,'o',color='#FFA069',linewidth=2,ls='-')
​
ax2.set_ylabel('%')
​
for rect in rects:
    height = rect.get_height()
    ax1.annotate('{}'.format(height),
            xy=(rect.get_x() + rect.get_width() / 2, height),
            xytext=(0,1),  # 1 points vertical offset
            textcoords="offset points",
            ha='center', va='bottom')
ax1.set_title("Pareto in Matplotlib") #


Matplotlib绘制帕累托图

子图

除了组合图外,有时候我们也需要将多个图并排以展现某种数据关系。前面说过一个画布下可以有多套Axes,正常情况下我们只需要一套Axes用来画图,但是也经常需要在一个画布中画多张图,形成分面或子母图的效果,前面我们基本都是写fig, ax= plt.subplots(),实际上subplots()可以设置nrows、ncols参数生成多套Axes。

plt.subplots()的常用写法有:

  • plt.subplot(3,2,4):在全局绘图区域中建立3行、2列的分区绘图区域,并定位到第4个子图区域,返回一个axes;
  • plt.subplot(324): 效果和上面subplot(3,2,4)的写法一致;
  • plt.subplots(): 默认1行1列,生成的axes就是一个;
  • plt.subplots(3,2) : 没有指定绘图编号,返回值包括一个figure和多个axes,和ax[0, 0].×××(x, y)搭配着用;
  • fig = plt.figure(); ax= fig.add_subplot(221):先建立一个画布,在画布上添加2x2个子图,并定位到顺序第一个子图;


生成多个绘图区域


图中代码在全局绘图区域中建立n行、m列的分区绘图区域,并定位到其中一个子图区域。之后ax的用法和前面一致,不赘述。


生成的图片在shell环境中弹出的界面有保存图片的按键,在jupyter环境中可以点击图片然后右键保存。而如果要通过代码保存图片到本地,一般通过plt.savefig(fname,dpi=300)保存图片,参数有文件保存路径(fname)、图片每英寸像素(dpi)、边缘颜色(edgecolor)等。在shell环境中一般通过plt.show()展示图片,而jupyter notebook中通常写%matplotlib inline将图片直接在Out[]里输出展示。


Matplotlib的rcParams接口可以设置很多个性化内容,包括刚提到的savefig的edgecolor默认值,可以写mpl.rcParams["savefig.edgecolor"]='blue'改变原来的默认值white。直方图的默认分箱数可以通过rcParams["hist.bins"]=5改变。

而为了在Matplotlib中支持中文,各教程的解决方案基本都有mpl.rcParams['font.family']='SimHei'这句,就是将Matplotlib的字体替换为微软雅黑。前面基础图表绘制部分通过更新mpl.rcParams["axes.prop_cycle"]改变了绘图的主题色,Matplotlib本身是提供了备选的绘图渲染的各种主题,可以通过style.use('ggplot')调用ggplot主题(想换回默认主题用style.use('default'))。就像给输入法换皮肤一样,rcParams接口给了我们更多的自由度和个性化。

三维及科学可视化

三维可视化和科学可视化是Matplotlib特别擅长的领域,人类作为三维生物,对三维的图像有一定的偏好,扁平化和三维各有优势,各有不同的应用场合,能画好二维可视化图也该会画三维的图表,且一些场景用好三维有奇效。Matplotlib的三维可视化封装在mpl_toolkits工具套件的mplot3d里,mplot3d下的API主要包括Axes3D(三维坐标轴区域)、art3d.xx3D(三维图元)和proj3d(三维坐标变换)。



from mpl_toolkits.mplot3d import Axes3D  # noqa: F401 unused import
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.bar(df['x'],df['y'], zs=0, zdir='y', alpha=0.8)
ax.bar(df['x'],df['z'], zs=1, zdir='y', alpha=0.8)
ax.bar(df['x'],df['y'], zs=2, zdir='y', alpha=0.8)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

ax.set_yticks([0,1,2])

三维可视化和科学可视化联系很紧密,科研作图中应用广泛,各种漂亮的参数曲面在官网示例里有很多,这里略过、当然二维下也能画出很优美的函数图像,结合numpy生成[0,2]之间的正弦函数曲线只需要4行代码:

t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
fig, ax = plt.subplots()
ax.plot(t, s)


绘制指数函数、分形的雪花曲线也是类似的过程,在官网案例集有类似的例子,具体这里不展开。


matplotlib可视化思维导图


总结下本文从Matplotlib的可视化基础框架一步步画散点、折线、柱状、箱线等图,通过理解参数拓展画了瀑布图、矩阵图、棒棒糖图等,并且微调坐标轴文本、标题等图形元素,让可视化更完备,通过双y轴绘制帕累托图等组合图,也绘制了包含多张子图的图和三维图。

通过以上实践可以看到的Matplotlib可视化语法的特点是绘图对象和标签标题等元素有一定独立性,且有不同层级的接口可以用来微调元素,例如设置标题就有多种写法 ,Matplotlib不同于ggplot2的管道写法、也不同于Altair等库将数据传到chart对象再调用mark_bar()等确定绘制什么图。可视化是要好看,也不能忘了所展现的数据与数据间的关系是重点。

最后用极坐标绘心形线结束本文。



文中代码更新于https://github.com/QLWeilcf/VisualizedLyn/blob/master/viz-matplotlib-in-action-lyns.ipynb。代码可以直接下载运行。有任何建议欢迎留言交流。