梦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')设置标题, 整理如下:
常用图表标签添加的接口
图形元素设置除了文本类型之外,也可以往里加形状 。
给散点图加标签并加分隔线绘制矩阵图以实践一下以上方法:
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()的常用写法有:
生成多个绘图区域
图中代码在全局绘图区域中建立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。代码可以直接下载运行。有任何建议欢迎留言交流。
*请认真填写需求信息,我们会在24小时内与您取得联系。