Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matlab in Linux (Ubuntu 11.10) doesn't display Unicode (Hebrew) in plot figure

I try to use Hebrew characters in a Matlab figure plot on my Ubuntu to no avail. I tried:

text(0.6,0.5,'ירוק','fontname','times new roman','rotation',180,'fontsize',50,'color','r')

and

title('ירוק','fontname','times new roman','fontsize',50,'color','r')

similar to what was proposed in the answer to this question. I got garbled text (see attached image).

Matlab is in version R2009b. Of course I'm set to UTF-8 encoding.

>> slCharacterEncoding

ans =

UTF-8

I also have access to a remote computer via ssh, with version R2011a. That didn't work either. (There I had to slCharacterEncoding('UTF-8'))

The other option, using a javax.swing.JLabel component, is too difficult to use with the amount of graphing I have.

I can continue producing graphs with English axes and titles, but that's a pity. Any advice?


Edit: as suggested by Egon, if I can print -deps and then replace the text (from code within Matlab) in the resulting EPS file, that's pretty cool too. But I don't know how to place Unicode in EPS and I think that's stretching it...

Screenshot of figure screen showing rubbish


Yet another edit: I'm starting to think this is an X-server issue. Though different, I wouldn't be surprised if these issues are related:

  • Matlab figure fonts: broken in 11.04 contd. here
  • How to fix MATLAB small figures and small fonts in Ubuntu linux
  • View Full Version : [ubuntu] huge fonts in matlab

I tried uninstalling Ubuntu supplied NVidia drivers (I have an 9300GS card) and re-installing NVidia supplied ones (v295). I tried changing DPI in xorg.conf to "100 x 100". Installed all packages listed in HebrewLocalizationHowto and then some. Nothing worked. Suggestions?


Another edit Fonts located under matlab/sys/fonts/ttf or matlab/sys/fonts/type1 aren't rendered correctly. When I edit the figure and double click the title, I see the characters are there, but when I finish editing it returns to the bad rendering. Also, the JLabel solution for rendering Unicode characters suggested here renders text correctly under the same figure.

Another edit Matlab R2011a exhibits the same issue. Here's the output of listfonts

>> listfonts

ans = 

    'aharoni'
    'andale mono'
    'anka clm'
    'arial'
    'arial black'
    'avant garde gothic'
    'AvantGarde'
    'batang'
    'bitstream charter'
    'biwidth'
    'Bookman'
    'caladings'
    'century schoolbook l'
    'charter'
    'clean'
    'clearlyu'
    'clearlyu alternate glyphs'
    'clearlyu arabic'
    'clearlyu arabic extra'
    'clearlyu devanagari'
    'clearlyu devangari extra'
    'clearlyu ligature'
    'clearlyu pua'
    'cmex10'
    'cmmi10'
    'cmr10'
    'cmsy10'
    'comic sans ms'
    'comix no2 clm'
    'Courier'
    'courier 10 pitch'
    'courier new'
    'dingbats'
    'dorian clm'
    'dotum'
    'drugulin'
    'ellinia'
    'fangsong ti'
    'fixed'
    'frank ruehl'
    'gan clm'
    'georgia'
    'gladia clm'
    'gothic'
    'Helvetica'
    'Helvetica-Narrow'
    'impact'
    'itc avant garde gothic'
    'itc bookman'
    'itc zapf chancery'
    'itc zapf dingbats'
    'ktav yad clm'
    'latin modern roman'
    'latin modern sans'
    'latin modern sansquotation'
    'latin modern typewriter'
    'latin modern typewriter variable width'
    'lucida'
    'lucida bright'
    'lucidabright'
    'lucidasans'
    'lucidasans typewriter'
    'lucidatypewriter'
    'mincho'
    'msam10'
    'msbm10'
    'nachlieli'
    'new century schoolbook'
    'newcenturyschlbk'
    'NewCenturySchoolBook'
    'newspaper'
    'nil'
    'nimbus mono l'
    'nimbus roman no9 l'
    'nimbus sans l'
    'open look cursor'
    'open look glyph'
    'ozrad clm'
    'Palatino'
    'song ti'
    'standard symbols l'
    'Symbol'
    'terminal'
    'texgyreadventor'
    'texgyrebonum'
    'texgyrecursor'
    'texgyreheros'
    'texgyrepagella'
    'texgyreschola'
    'texgyretermes'
    'Times'
    'times new roman'
    'trebuchet ms'
    'urw bookman l'
    'urw chancery l'
    'urw gothic l'
    'urw palladio l'
    'verdana'
    'wasy10'
    'webdings'
    'yehuda'
    'zapf chancery'
    'zapf dingbats'
    'ZapfChancery'
    'ZapfDingbats'
like image 690
Yuval Avatar asked Mar 02 '12 19:03

Yuval


2 Answers

Have you tried disabling the text interpreter?

So either adding 'interpreter', 'none' as the last few arguments of your call to text or setting this for the entire figure set(gcf,'defaulttextinterpreter','none'). To apply that globally, just replace gcf by 0 (that is the root window).

If that doesn't work, you might try the LateX interpreter (replace none by 'latex' above), which might have support for Hebrew characters.

On the other hand, but this is a personal preference, English labels allow (virtually) anyone to read your figures which only allows you to exchange ideas with other people.

edit As said in the question you referenced, it is a font problem, not a MATLAB problem. I tried it here on my Arch install (which has its fonts problems of its own), but I can get it to display your Hebrew characters just fine using the Arial font.

Proof of Hebrew

edit 2 Again, this is a font problem, not MATLAB. I again tried this on my Arch install, and now Hebrew works fine with your first code. So I assume the fonts you have installed are not the right versions.

enter image description here

On Arch, I have these font-related packages installed:

extra/cantarell-fonts 0.0.7-1
extra/font-bitstream-speedo 1.0.1-2
extra/fontsproto 2.1.2-1
extra/gsfonts 1.0.7pre44-3
extra/sdl_ttf 2.0.11-2
extra/t1lib 5.1.2-3
extra/ttf-bitstream-vera 1.10-8
extra/ttf-dejavu 2.33-2
extra/ttf-freefont 20100919-2
extra/xorg-font-util 1.3.0-1
extra/xorg-fonts-100dpi 1.0.1-4
extra/xorg-fonts-75dpi 1.0.1-4
extra/xorg-fonts-alias 1.0.2-2
extra/xorg-fonts-encodings 1.0.4-3
extra/xorg-fonts-misc 1.0.1-2
extra/xorg-fonts-type1 7.4-2
extra/xorg-mkfontscale 1.1.0-1
extra/xorg-xfontsel 1.0.4-1
extra/xorg-xlsfonts 1.0.3-2
community/ttf-liberation 1.07.2-1
aur/ttf-microsoft-wingding 1.55-1
aur/ttf-ms-fonts 2.0-9

For Ubuntu, I don't remember the correct packages, but I guess you'd have the highest chances of success with ttf-liberation, ttf-ms-conts (msttcorefonts in Ubuntu), xorg-fonts-100dpi, xorg-fonts-alias or their Debian/Ubuntu counterparts.

So I think there are two possible solutions: either try another font. Arial worked for me before, Times New Roman now also works for me. Or install the proper fonts on your computer.

edit On this end, it seems that rendering in MATLAB works almost perfectly. However, export to PDF doesn't work. Any bitmap formats should work fine.

My next guess, is indeed that for the PDF case, MATLAB is to blame. I did some tests by using the regular PDF save and printing to a file. Both exhibit the same problem. This is not surprising, since the PDF save feature in MATLAB seems to generate PS which is converted to PDF afterwards. Presumably, there is something rotten and unicode incompatible going on in the PS generation.

I know it is not a complete solution to your problem, but you can at least export your figures into PNG, if your resolution is high enough, most people won't notice.

Another solution, if you use LaTeX to generate your report, is to use matlab2tikz to generate your figures, there I was able to get the Hebrew text to be inserted into LaTeX code. However, since I don't have experience with Hebrew in my TeX files, I don't know the tricks to get that to compile.

like image 153
Egon Avatar answered Oct 19 '22 19:10

Egon


Using the following snippet you can see which fonts work easily

x=listfonts
for i=1:numel(x) 
    display(x{i})
    title('ירוק','Color','red','FontName',x{i},'FontSize',50)
    pause
end

For me Lucida Sans worked. However it will display Hebrew reversed.

You can export to EPS (print -deps -- I have found this to be unavailable in Windows; then again, you don't have the problem there) and do some modifications:

  • remove encoding horror from Matlab: simple remove all occurrences of \327
  • add an /Encoding section to map Hebrew characters to the codes output by Matlab

That is, change this:

%%IncludeResource: font FreeSans
/FreeSans /ISOLatin1Encoding 200 FMSR

-6384  483 mt 
(\327\220\327\221\327\222\327\223\327\224\327\225\327\226\327\227\327\230\327\231\327\233\327\234\327\236\327\240\327\241\327\242\327\244\327\246\327\250\327\247\327\251\327\252\327\237\327\232\327\245\327\235\327\243) s

to this:

/Encoding [
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/space /exclam /quotedbl /numbersign 
/dollar /percent /ampersand /quoteright 
/parenleft /parenright /asterisk /plus 
/comma /minus /period /slash 
/zero /one /two /three 
/four /five /six /seven 
/eight /nine /colon /semicolon 
/less /equal /greater /question 
/at /A /B /C 
/D /E /F /G 
/H /I /J /K 
/L /M /N /O 
/P /Q /R /S 
/T /U /V /W 
/X /Y /Z /bracketleft 
/backslash /bracketright /asciicircum /underscore 
/quoteleft /a /b /c 
/d /e /f /g 
/h /i /j /k 
/l /m /n /o 
/p /q /r /s 
/t /u /v /w 
/x /y /z /braceleft 
/bar /braceright /asciitilde /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/alefhebrew /bethebrew /gimelhebrew /dalethebrew 
/hehebrew /vavhebrew /zayinhebrew /hethebrew 
/tethebrew /yodhebrew /finalkafhebrew /kafhebrew /lamedhebrew 
/finalmemhebrew /memhebrew /finalnunhebrew /nunhebrew /samekhhebrew /ayinhebrew 
/finalpehebrew /pehebrew /finaltsadihebrew /tsadihebrew /qofhebrew /reshhebrew 
/shinhebrew /tavhebrew /.notdef /.notdef 
/.notdef /registered /macron 
/degree /plusminus /twosuperior /threesuperior 
/acute /mu /paragraph /periodcentered 
/cedilla /onesuperior /ordmasculine /guillemotright 
/onequarter /onehalf /threequarters /questiondown 
/Agrave /Aacute /Acircumflex /Atilde 
/Adieresis /Aring /AE /Ccedilla 
/Egrave /Eacute /Ecircumflex /Edieresis 
/Igrave /Iacute /Icircumflex /Idieresis 
/Eth /Ntilde /Ograve /Oacute 
/Ocircumflex /Otilde /Odieresis /multiply 
/Oslash /Ugrave /Uacute /Ucircumflex 
/Udieresis /Yacute /Thorn /germandbls 
/agrave /aacute /acircumflex /atilde 
/adieresis /aring /ae /ccedilla 
/egrave /eacute /ecircumflex /edieresis 
/igrave /iacute /icircumflex /idieresis 
/eth /ntilde /ograve /oacute 
/ocircumflex /otilde /odieresis /divide 
/oslash /ugrave /uacute /ucircumflex 
/udieresis /yacute /thorn /ydieresis 
] def

%%IncludeResource: font FreeSans
/FreeSans /Encoding 200 FMSR
1016  483 mt 
(\220\221\222\223\224\225\226\227\230\231\233\234\236\240\241\242\244\246\250\247\251\252\237\232\245\235\243) s

(The encoding section can be copies as-is; and the \327 occurences were removed)

This works, except that for some reason one final character doesn't display correctly. It's good enough for me.

like image 40
Yuval Avatar answered Oct 19 '22 19:10

Yuval