এমএটিএলবি-তে xkcd স্টাইলের গ্রাফ


224

xkcd- স্টাইলের গ্রাফ

মেধাবী লোকেরা ইতিমধ্যে ম্যাথমেটিকা , লাটেক্সে , পাইথন এবং আর-তে কীভাবে এক্স কে সি ডি স্টাইলের গ্রাফ তৈরি করবেন তা নির্ধারণ করেছেন ।

উপরের মতো দেখতে একটি প্লট তৈরি করতে কেউ কীভাবে ম্যাটল্যাব ব্যবহার করতে পারে?

আমি যা চেষ্টা করেছি

আমি উইগলি লাইন তৈরি করেছি, কিন্তু আমি উইগলি অক্ষ পেতে পারি না। একমাত্র সমাধানটি আমি ভেবেছিলাম সেগুলি উইগলি লাইনে ওভাররাইট করা, তবে আমি প্রকৃত অক্ষগুলি পরিবর্তন করতে সক্ষম হতে চাই। আমি হিউমার ফন্টটিও কাজ করতে পারি না, কোড বিটটি ব্যবহৃত হয়েছিল:

 annotation('textbox',[left+left/8 top+0.65*top 0.05525 0.065],...
'String',{'EMBARRASSMENT'},...
'FontSize',24,...
'FontName','Humor',...
'FitBoxToText','off',...
'LineStyle','none');

উইগলি লাইনের জন্য, আমি একটি ছোট এলোমেলো শব্দ এবং স্মুথিং যুক্ত করে পরীক্ষা করেছি:

 smooth(0.05*randn(size(x)),10)

যখন তারা ছেদ করে তখন আমি তাদের চারদিকে সাদা ব্যাকগ্রাউন্ডটি উপস্থিত হতে পারি না ...


9
সম্পাদনাটি "প্রথমে কিছু প্রাথমিক গবেষণা করেছে" সন্তুষ্ট বলে মনে হচ্ছে। এছাড়াও, এখানে উত্তরগুলি দুর্দান্ত। পুনরায় খোলার।
শোগ 9

উত্তর:


117

আমি এটি সমাধানের দুটি উপায় দেখতে পাচ্ছি: প্রথম উপায়টি প্লটের বৈশিষ্ট্যগুলির x / y স্থানাঙ্কগুলিতে কিছুটা জিটার যুক্ত করা। এটির সুবিধাটি হ'ল আপনি সহজেই একটি চক্রান্ত পরিবর্তন করতে পারবেন তবে আপনি যদি xkcdyified পেতে চান তবে আপনাকে নিজেরাই অক্ষগুলি আঁকতে হবে ( @ রডি ওলেনহুইসের সমাধান দেখুন )। দ্বিতীয় উপায়টি হ'ল একটি জিটারি প্লট তৈরি imtransformকরা এবং চিত্রটিতে এলোমেলো বিকৃতি প্রয়োগ করতে ব্যবহার করা। এটির কোনও সুবিধা রয়েছে যে আপনি এটি কোনও প্লটের সাথে ব্যবহার করতে পারবেন তবে আপনি কোনও সম্পাদনাযোগ্য প্লট নয়, তবে একটি চিত্র দিয়ে শেষ করবেন।

আমি প্রথমে # 2 দেখাব, এবং নীচে # 1 এ আমার প্রচেষ্টা (যদি আপনি # 1 আরও ভাল পছন্দ করেন তবে রডির সমাধানটি দেখুন !)।

এখানে চিত্র বর্ণনা লিখুন

এই সমাধান দুই মূল ফাংশন উপর নির্ভর EXPORT_FIG ফাইল বিনিময় থেকে বিরোধী বেনামে স্ক্রিনশট এবং পেতে IMTRANSFORM একটি রূপান্তর জন্য।

%# define plot data
x = 1:0.1:10;
y1 = sin(x).*exp(-x/3) + 3;
y2 = 3*exp(-(x-7).^2/2) + 1;

%# plot
fh = figure('color','w');
hold on
plot(x,y1,'b','lineWidth',3);
plot(x,y2,'w','lineWidth',7);
plot(x,y2,'r','lineWidth',3);

xlim([0.95 10])
ylim([0 5])
set(gca,'fontName','Comic Sans MS','fontSize',18,'lineWidth',3,'box','off')

%# add an annotation 
 annotation(fh,'textarrow',[0.4 0.55],[0.8 0.65],...
     'string',sprintf('text%shere',char(10)),'headStyle','none','lineWidth',1.5,...
     'fontName','Comic Sans MS','fontSize',14,'verticalAlignment','middle','horizontalAlignment','left')

%# capture with export_fig
im = export_fig('-nocrop',fh);

%# add a bit of border to avoid black edges
im = padarray(im,[15 15 0],255);

%# make distortion grid
sfc = size(im);
[yy,xx]=ndgrid(1:7:sfc(1),1:7:sfc(2));
pts = [xx(:),yy(:)];
tf = cp2tform(pts+randn(size(pts)),pts,'lwm',12);
w = warning;
warning off images:inv_lwm:cannotEvaluateTransfAtSomeOutputLocations
imt = imtransform(im,tf);
warning(w)

%# remove padding
imt = imt(16:end-15,16:end-15,:);

figure('color','w')
imshow(imt)

এখানে আমার চটজলদি করার প্রয়াস

এখানে চিত্র বর্ণনা লিখুন

%# define plot data
x = 1:0.1:10;
y1 = sin(x).*exp(-x/3) + 3;
y2 = 3*exp(-(x-7).^2/2) + 1;

%# jitter
x = x+randn(size(x))*0.01;
y1 = y1+randn(size(x))*0.01;
y2 = y2+randn(size(x))*0.01;

%# plot
figure('color','w')
hold on
plot(x,y1,'b','lineWidth',3);
plot(x,y2,'w','lineWidth',7);
plot(x,y2,'r','lineWidth',3);

xlim([0.95 10])
ylim([0 5])
set(gca,'fontName','Comic Sans MS','fontSize',18,'lineWidth',3,'box','off')

4
আপনার সময়টি এসও তে উপভোগ করুন ! ;)
gnovice

2
@ জ্ঞানভোজ: এটি আমার তৃতীয় হবে। আমি আশা করি এতক্ষণে আমি এটি বেশ ভালভাবেই বের করে ফেলেছি :)
জোনাস

@ জোনাস ভাল কাজ! আমি মনে করি এখন পর্যন্ত সমস্ত সমাধানের মধ্যে আপনার # 2 টি উইগলসের জন্য সঠিক অনুভূতি পেয়েছে। যাইহোক, এটা এখনও বড় ব্যার্থ wiggly ticks, টেক্সট কাছাকাছি একটি ফ্রেম, এবং হাতের একটি লাইন লেখা থেকে বিন্দু বাঁকা লাইন টানা ...
bla

2
EXPORT_FIG এর জন্য +1। অ্যান্টি-এলিয়জিংয়ের জন্য আমার সমস্ত গ্রাফকে আরও আনন্দদায়ক ধন্যবাদগুলি ঘুরিয়ে দেওয়া।
ইয়ামেনেকো

1
@ জেসনস: দুঃখিত, আমার কাছে এটি তখন সবচেয়ে কাছের ছিল।
জোনাস

92

পরিবর্তিত সমস্ত প্লট ফাংশন পুনরায় বাস্তবায়নের পরিবর্তে আমি একটি জেনেরিক সরঞ্জাম তৈরি করতে চেয়েছিলাম যা কোনও বিদ্যমান প্লটকে এক্সকেসিডি শৈলীর প্লটে রূপান্তর করতে পারে।

এই পদ্ধতির অর্থ হ'ল আপনি প্লট তৈরি করতে পারেন এবং স্ট্যান্ডার্ড ম্যাটল্যাব ফাংশনগুলি ব্যবহার করে তাদের স্টাইল করতে পারবেন এবং তারপরে আপনি যখন কাজটি শেষ করেন তখন প্লটের সামগ্রিক শৈলী সংরক্ষণের সময় আপনি এক্সকেসিডি স্টাইলে প্লটটি পুনরায় রেন্ডার করতে পারেন।

উদাহরণ

পটভূমি এখানে চিত্র বিবরণ লিখুন

বার ও প্লট

এখানে চিত্র বিবরণ লিখুন

বক্স চক্রান্ত এখানে চিত্র বিবরণ লিখুন

কিভাবে এটা কাজ করে

একটি অক্ষের বাচ্চাদের উপর পুনরাবৃত্তি করে ফাংশনটি কাজ করে। যদি বাচ্চারা টাইপ হয় lineবা patchএটি তাদের সামান্য বিকৃত করে। যদি শিশু এটি টাইপ hggroupকরে থাকে তবে তার উপ-শিশুদের উপর পুনরাবৃত্তি হবে hggroup। আমার যেমন অন্য প্লটের ধরণের সমর্থন করার পরিকল্পনা রয়েছে imageতবে এক্স কে সি ডি শৈলীতে চিত্র বিকৃতি করার সর্বোত্তম উপায় কোনটি তা পরিষ্কার নয়।

অবশেষে এই বিকৃতিটি অভিন্ন দেখায় তা নিশ্চিত করার জন্য (এটি হ'ল ছোট লাইনগুলি দীর্ঘ লাইনের চেয়ে বেশি বিকৃত হয় না), আমি পিক্সেলের মধ্যে রেখার দৈর্ঘ্যটি পরিমাপ করি এবং তারপরে তার দৈর্ঘ্যের সাথে নমুনা আনুপাতিক। আমি তারপরে প্রতিটি Nth নমুনায় শোরগোল যুক্ত করি যা এমন লাইন তৈরি করে যাতে কম বেশি পরিমাণে বিকৃতি ঘটে।

কোড

কোডের কয়েকশ লাইন পেস্ট করার পরিবর্তে আমি কেবল উত্সটির সংক্ষেপে লিঙ্ক করব । উপরের উদাহরণগুলি উত্পন্ন করার জন্য উত্স কোড এবং কোডগুলি নিখরচায় গিটহাব উপলভ্য ।

উদাহরণস্বরূপ আপনি দেখতে পাচ্ছেন, এটি এখনও অক্ষগুলি বিকৃত করে না যদিও আমি এটি করার সর্বোত্তম উপায়টি বের করার সাথে সাথে বাস্তবায়ন করার পরিকল্পনা করছি।


4
নিস! আমি একই ধরণের কোডের কাজ করছি যা export_figরুটটি কার্যকর করে , অর্থাৎ এটি প্রথমে প্লটটি xkcd- এর মতো করে ফর্ম্যাট করে এবং তারপরে চিত্রটি বিকৃত করে।
জোনাস

4
ধন্যবাদ। বক্স প্লট নিয়ে আমি সত্যিই গর্বিত। এই প্লটগুলি দেখানোর জন্য প্রয়োজনীয় হ্যাকিংয়ের স্তরে আমি অবাক হয়েছি।
স্লেটন

আমি আমার সম্পূর্ণ উপস্থাপনাটিকে XKCD স্টাইলে রূপান্তর করতে এটি ব্যবহার করব।
ইয়ামেনেকো

হাই স্লেটন, তারা দুর্দান্ত! আমার কেবল একটি প্রশ্ন আছে, অক্ষগুলি কার্টুনি / এক্সকেসিডি-ইশ করারও কি উপায় আছে? এটি আমার জন্য এটি করবে এবং আমি এটি ব্যবহার করতে সক্ষম হব! :-) অনেক ধন্যবাদ ...
স্পেসি

@ লেয়ার্নাহোলিক এএফআইএইচ ম্যাটল্যাব অক্ষগুলি যেভাবে সরবরাহ করা হয়েছে তা পরিবর্তনের জন্য কোনও এপিআই (নথিভুক্ত বা অনথিভুক্ত) সরবরাহ করে না
স্লেটন

63

প্রথম পদক্ষেপ ... আপনার পছন্দ মতো একটি সিস্টেম ফন্ট সন্ধান করুন ( listfontsউপলভ্য কী কী তা দেখতে ফাংশনটি ব্যবহার করুন ) অথবা এক্স কেসিডি থেকে হস্তাক্ষর শৈলীর সাথে মেলে এমন একটি ইনস্টল করুন । আমি এই ব্লগ পোস্টে উল্লিখিত ব্যবহারকারীর ch00f এর একটি "হিউমার সানস" ট্রু টাইপ ফন্ট পেয়েছি এবং এটি আমার পরবর্তী উদাহরণগুলির জন্য ব্যবহার করব।

আমি এটি দেখতে পাচ্ছি, এই ধরণের গ্রাফগুলি তৈরি করতে আপনার সাধারণত তিনটি পরিবর্তিত গ্রাফিক্স অবজেক্টগুলির প্রয়োজন: একটি অক্ষ বস্তু , একটি লাইন অবজেক্ট এবং একটি পাঠ্য অবজেক্ট । জিনিসগুলি আরও সহজ করার জন্য আপনি কোনও টীকাগুলির জিনিসও চাইতে পারেন , তবে আমি আগে থেকেই জানতাম যে উপরের তিনটি বস্তুর চেয়ে এটি কার্যকর করা আরও কঠিন হতে পারে।

আমি র‍্যাপার ফাংশন তৈরি করেছি যা তিনটি বস্তু তৈরি করেছে, আরও বেশি এক্সকেসিডি -র মতো তৈরি করার জন্য নির্দিষ্ট সম্পত্তি সেটিংসকে ওভাররাইড করে। একটি সীমাবদ্ধতা হ'ল তাদের উত্পন্ন নতুন গ্রাফিকগুলি নির্দিষ্ট ক্ষেত্রে আপডেট করা হবে না (যেমন অক্ষগুলি পুনরায় আকার দেওয়ার সময় পাঠ্য বস্তুগুলিতে বাউন্ডিং বক্সগুলি) তবে এটি হ্যান্ডেল থেকে উত্তরাধিকার সূত্রে আরও সম্পূর্ণ অবজেক্ট-ভিত্তিক বাস্তবায়নের জন্য গণ্য হতে পারে ক্লাস , ইভেন্ট এবং শ্রোতা ব্যবহার করে ইত্যাদি আপাতত, এখানে আমার সহজ প্রয়োগসমূহ:

xkcd_axes.m:

function hAxes = xkcd_axes(xkcdOptions, varargin)

  hAxes = axes(varargin{:}, 'NextPlot', 'add', 'Visible', 'off', ...
               'XLimMode', 'manual', 'YLimMode', 'manual');

  axesUnits = get(hAxes, 'Units');
  set(hAxes, 'Units', 'pixels');
  axesPos = get(hAxes, 'Position');
  set(hAxes, 'Units', axesUnits);
  xPoints = round(axesPos(3)/10);
  yPoints = round(axesPos(4)/10);
  limits = [xlim(hAxes) ylim(hAxes)];
  ranges = [abs(limits(2) - limits(1)) abs(limits(4) - limits(3))];
  backColor = get(get(hAxes, 'Parent'), 'Color');
  xColor = get(hAxes, 'XColor');
  yColor = get(hAxes, 'YColor');
  line('Parent', hAxes, 'Color', xColor, 'LineWidth', 3, ...
       'Clipping', 'off', ...
       'XData', linspace(limits(1), limits(2), xPoints), ...
       'YData', limits(3) + rand(1, xPoints).*0.005.*ranges(2));
  line('Parent', hAxes, 'Color', yColor, 'LineWidth', 3, ...
       'Clipping', 'off', ...
       'YData', linspace(limits(3), limits(4), yPoints), ...
       'XData', limits(1) + rand(1, yPoints).*0.005.*ranges(1));

  xTicks = get(hAxes, 'XTick');
  if ~isempty(xTicks)
    yOffset = limits(3) - 0.05.*ranges(2);
    tickIndex = true(size(xTicks));
    if ismember('left', xkcdOptions)
      tickIndex(1) = false;
      xkcd_arrow('left', [limits(1) + 0.02.*ranges(1) xTicks(1)], ...
                 yOffset, xColor);
    end
    if ismember('right', xkcdOptions)
      tickIndex(end) = false;
      xkcd_arrow('right', [xTicks(end) limits(2) - 0.02.*ranges(1)], ...
                 yOffset, xColor);
    end
    plot([1; 1]*xTicks(tickIndex), ...
         0.5.*[-yOffset; yOffset]*ones(1, sum(tickIndex)), ...
         'Parent', hAxes, 'Color', xColor, 'LineWidth', 3, ...
         'Clipping', 'off');
    xLabels = cellstr(get(hAxes, 'XTickLabel'));
    for iLabel = 1:numel(xLabels)
      xkcd_text(xTicks(iLabel), yOffset, xLabels{iLabel}, ...
                'HorizontalAlignment', 'center', ...
                'VerticalAlignment', 'middle', ...
                'BackgroundColor', backColor);
    end
  end

  yTicks = get(hAxes, 'YTick');
  if ~isempty(yTicks)
    xOffset = limits(1) - 0.05.*ranges(1);
    tickIndex = true(size(yTicks));
    if ismember('down', xkcdOptions)
      tickIndex(1) = false;
      xkcd_arrow('down', xOffset, ...
                 [limits(3) + 0.02.*ranges(2) yTicks(1)], yColor);
    end
    if ismember('up', xkcdOptions)
      tickIndex(end) = false;
      xkcd_arrow('up', xOffset, ...
                 [yTicks(end) limits(4) - 0.02.*ranges(2)], yColor);
    end
    plot(0.5.*[-xOffset; xOffset]*ones(1, sum(tickIndex)), ...
         [1; 1]*yTicks(tickIndex), ...
         'Parent', hAxes, 'Color', yColor, 'LineWidth', 3, ...
         'Clipping', 'off');
    yLabels = cellstr(get(hAxes, 'YTickLabel'));
    for iLabel = 1:numel(yLabels)
      xkcd_text(xOffset, yTicks(iLabel), yLabels{iLabel}, ...
                'HorizontalAlignment', 'right', ...
                'VerticalAlignment', 'middle', ...
                'BackgroundColor', backColor);
    end
  end

  function xkcd_arrow(arrowType, xArrow, yArrow, arrowColor)
    if ismember(arrowType, {'left', 'right'})
      xLine = linspace(xArrow(1), xArrow(2), 10);
      yLine = yArrow + rand(1, 10).*0.003.*ranges(2);
      arrowScale = 0.05.*ranges(1);
      if strcmp(arrowType, 'left')
        xArrow = xLine(1) + arrowScale.*[0 0.5 1 1 1 0.5];
        yArrow = yLine(1) + arrowScale.*[0 0.125 0.25 0 -0.25 -0.125];
      else
        xArrow = xLine(end) - arrowScale.*[0 0.5 1 1 1 0.5];
        yArrow = yLine(end) + arrowScale.*[0 -0.125 -0.25 0 0.25 0.125];
      end
    else
      xLine = xArrow + rand(1, 10).*0.003.*ranges(1);
      yLine = linspace(yArrow(1), yArrow(2), 10);
      arrowScale = 0.05.*ranges(2);
      if strcmp(arrowType, 'down')
        xArrow = xLine(1) + arrowScale.*[0 0.125 0.25 0 -0.25 -0.125];
        yArrow = yLine(1) + arrowScale.*[0 0.5 1 1 1 0.5];
      else
        xArrow = xLine(end) + arrowScale.*[0 -0.125 -0.25 0 0.25 0.125];
        yArrow = yLine(end) - arrowScale.*[0 0.5 1 1 1 0.5];
      end
    end
    line('Parent', hAxes, 'Color', arrowColor, 'LineWidth', 3, ...
         'Clipping', 'off', 'XData', xLine, 'YData', yLine);
    patch('Parent', hAxes, 'FaceColor', arrowColor, ...
          'EdgeColor', arrowColor, 'LineWidth', 2, 'Clipping', 'off', ...
          'XData', xArrow + [0 rand(1, 5).*0.002.*ranges(1)], ...
          'YData', yArrow + [0 rand(1, 5).*0.002.*ranges(2)]);
  end

end

xkcd_text.m:

function hText = xkcd_text(varargin)

  hText = text(varargin{:});
  set(hText, 'FontName', 'Humor Sans', 'FontSize', 13, ...
      'FontWeight', 'normal');

  backColor = get(hText, 'BackgroundColor');
  edgeColor = get(hText, 'EdgeColor');
  if ~strcmp(backColor, 'none') || ~strcmp(edgeColor, 'none')
    hParent = get(hText, 'Parent');
    extent = get(hText, 'Extent');
    nLines = size(get(hText, 'String'), 1);
    extent = extent + [-0.5 -0.5 1 1].*0.25.*extent(4)./nLines;
    yPoints = 5*nLines;
    xPoints = round(yPoints*extent(3)/extent(4));
    noiseScale = 0.05*extent(4)/nLines;
    set(hText, 'BackgroundColor', 'none', 'EdgeColor', 'none');
    xBox = [linspace(extent(1), extent(1) + extent(3), xPoints) ...
            extent(1) + extent(3) + noiseScale.*rand(1, yPoints) ...
            linspace(extent(1) + extent(3), extent(1), xPoints) ...
            extent(1) + noiseScale.*rand(1, yPoints)];
    yBox = [extent(2) + noiseScale.*rand(1, xPoints) ...
            linspace(extent(2), extent(2) + extent(4), yPoints) ...
            extent(2) + extent(4) + noiseScale.*rand(1, xPoints) ...
            linspace(extent(2) + extent(4), extent(2), yPoints)];
    patch('Parent', hParent, 'FaceColor', backColor, ...
          'EdgeColor', edgeColor, 'LineWidth', 2, 'Clipping', 'off', ...
          'XData', xBox, 'YData', yBox);
    hKids = get(hParent, 'Children');
    set(hParent, 'Children', [hText; hKids(hKids ~= hText)]);
  end

end

xkcd_line.m:

function hLine = xkcd_line(xData, yData, varargin)

  yData = yData + 0.01.*max(range(xData), range(yData)).*rand(size(yData));
  line(xData, yData, varargin{:}, 'Color', 'w', 'LineWidth', 8);
  hLine = line(xData, yData, varargin{:}, 'LineWidth', 3);

end

এবং এখানে একটি নমুনা স্ক্রিপ্ট যা উপরের কমিকগুলি পুনরায় তৈরি করতে এগুলি ব্যবহার করে। আমি ginputমাউসের সাহায্যে প্লটে পয়েন্টগুলি চিহ্নিত করে লাইনগুলি পুনরায় তৈরি করেছি, সেগুলি ক্যাপচার করেছি, এবং তারপরে কীভাবে আমি চাই তা প্লট করে:

xS = [0.0359 0.0709 0.1004 0.1225 0.1501 0.1759 0.2219 0.2477 0.2974 0.3269 0.3582 0.3895 0.4061 0.4337 0.4558 0.4797 0.5074 0.5276 0.5589 0.5810 0.6013 0.6179 0.6271 0.6344 0.6381 0.6418 0.6529 0.6713 0.6842 0.6934 0.7026 0.7118 0.7265 0.7376 0.7560 0.7726 0.7836 0.7965 0.8149 0.8370 0.8573 0.8867 0.9033 0.9346 0.9659 0.9843 0.9936];
yS = [0.2493 0.2520 0.2548 0.2548 0.2602 0.2629 0.2629 0.2657 0.2793 0.2657 0.2575 0.2575 0.2602 0.2629 0.2657 0.2766 0.2793 0.2875 0.3202 0.3856 0.4619 0.5490 0.6771 0.7670 0.7970 0.8270 0.8433 0.8433 0.8243 0.7180 0.6199 0.5272 0.4510 0.4128 0.3392 0.2711 0.2275 0.1757 0.1485 0.1131 0.1022 0.0858 0.0858 0.1022 0.1267 0.1567 0.1594];

xF = [0.0304 0.0488 0.0727 0.0967 0.1335 0.1630 0.2090 0.2348 0.2698 0.3011 0.3269 0.3545 0.3803 0.4153 0.4466 0.4724 0.4945 0.5110 0.5350 0.5516 0.5608 0.5700 0.5755 0.5810 0.5884 0.6013 0.6179 0.6363 0.6492 0.6584 0.6676 0.6731 0.6842 0.6860 0.6934 0.7007 0.7136 0.7265 0.7394 0.7560 0.7726 0.7818 0.8057 0.8444 0.8794 0.9107 0.9475 0.9751 0.9917];
yF = [0.0804 0.0940 0.0967 0.1049 0.1185 0.1458 0.1512 0.1540 0.1649 0.1812 0.1812 0.1703 0.1621 0.1594 0.1703 0.1975 0.2411 0.3065 0.3801 0.4782 0.5708 0.6526 0.7452 0.8106 0.8324 0.8488 0.8433 0.8270 0.7888 0.7343 0.6826 0.5981 0.5300 0.4782 0.3910 0.3420 0.2847 0.2248 0.1621 0.0995 0.0668 0.0395 0.0232 0.0177 0.0204 0.0232 0.0259 0.0204 0.0232];

xE = [0.0267 0.0488 0.0856 0.1409 0.1759 0.2164 0.2514 0.3011 0.3269 0.3637 0.3969 0.4245 0.4503 0.4890 0.5313 0.5608 0.5939 0.6344 0.6694 0.6934 0.7192 0.7394 0.7523 0.7689 0.7891 0.8131 0.8481 0.8757 0.9070 0.9346 0.9604 0.9807 0.9936];
yE = [0.0232 0.0232 0.0232 0.0259 0.0259 0.0259 0.0313 0.0259 0.0259 0.0259 0.0368 0.0395 0.0477 0.0586 0.0777 0.0886 0.1213 0.1730 0.2466 0.2902 0.3638 0.5082 0.6499 0.7916 0.8924 0.9414 0.9550 0.9387 0.9060 0.8760 0.8542 0.8379 0.8188];

hFigure = figure('Position', [300 300 700 450], 'Color', 'w');
hAxes = xkcd_axes({'left', 'right'}, 'XTick', [0.45 0.60 0.7 0.8], ...
                  'XTickLabel', {'YARD', 'STEPS', 'DOOR', 'INSIDE'}, ...
                  'YTick', []);

hSpeed = xkcd_line(xS, yS, 'Parent', hAxes, 'Color', [0.5 0.5 0.5]);
hFear = xkcd_line(xF, yF, 'Parent', hAxes, 'Color', [0 0.5 1]);
hEmb = xkcd_line(xE, yE, 'Parent', hAxes, 'Color', 'r');

hText = xkcd_text(0.27, 0.9, ...
                  {'WALKING BACK TO MY'; 'FRONT DOOR AT NIGHT:'}, ...
                  'Parent', hAxes, 'EdgeColor', 'k', ...
                  'HorizontalAlignment', 'center');

hSpeedNote = xkcd_text(0.36, 0.35, {'FORWARD'; 'SPEED'}, ...
                       'Parent', hAxes, 'Color', 'k', ...
                       'HorizontalAlignment', 'center');
hSpeedLine = xkcd_line([0.4116 0.4282 0.4355 0.4411], ...
                       [0.3392 0.3256 0.3038 0.2820], ...
                       'Parent', hAxes, 'Color', 'k');
hFearNote = xkcd_text(0.15, 0.45, {'FEAR'; 'THAT THERE''S'; ...
                                   'SOMETHING'; 'BEIND ME'}, ...
                      'Parent', hAxes, 'Color', 'k', ...
                      'HorizontalAlignment', 'center');
hFearLine = xkcd_line([0.1906 0.1998 0.2127 0.2127 0.2201 0.2256], ...
                      [0.3501 0.3093 0.2629 0.2221 0.1975 0.1676], ...
                      'Parent', hAxes, 'Color', 'k');
hEmbNote = xkcd_text(0.88, 0.45, {'EMBARRASSMENT'}, ...
                     'Parent', hAxes, 'Color', 'k', ...
                     'HorizontalAlignment', 'center');
hEmbLine = xkcd_line([0.8168 0.8094 0.7983 0.7781 0.7578], ...
                     [0.4864 0.5436 0.5872 0.6063 0.6226], ...
                     'Parent', hAxes, 'Color', 'k');

এবং (শিঙা) এখানে ফলাফলের চক্রান্ত!

এখানে চিত্র বর্ণনা লিখুন


2
চমৎকার! আমার একমাত্র মন্তব্য হ'ল পাঠ্য থেকে যে রেখাগুলি নির্দেশ করে সেগুলি পাতলা এবং আরও বাঁকা হওয়া উচিত (কম উইগলি) ly
bla

4
এটি চমত্কার, যদিও প্লটটি আলিয়াসে ভুগছে। আমি এখানে যে মোকাবেলা করার সম্পর্কে একটি সংক্ষিপ্ত পোষ্ট লিখেছেন: hugocarr.com/index/xkcd-style-graphs-in-matlab
হুগুয়েনট

28

ঠিক আছে, এখানে আমার কম-অপরিশোধিত-তবে-এখনও-এখনও-এখনও-প্রচেষ্টা নেই:

%# init
%# ------------------------

noise = @(x,A) A*randn(size(x));
ns    = @(x,A) A*ones(size(x));


h = figure(2); clf, hold on
pos = get(h, 'position');
set(h, 'position', [pos(1:2) 800 450]);


blackline = {
    'k', ...
    'linewidth', 2};
axisline = {
    'k', ...
    'linewidth', 3};

textprops = {
    'fontName','Comic Sans MS',...
    'fontSize', 14,...
    'lineWidth',3};


%# Plot data
%# ------------------------
x  = 1:0.1:10;

y0 = sin(x).*exp(-x/30) + 3;
y1 = sin(x).*exp(-x/3) + 3;
y2 = 3*exp(-(x-7).^6/.05) + 1;

y0 = y0 + noise(x, 0.01);
y1 = y1 + noise(x, 0.01);
y2 = y2 + noise(x, 0.01);

%# plot
plot(x,y0, 'color', [0.7 0.7 0.7], 'lineWidth',3);

plot(x,y1, 'w','lineWidth',7);
plot(x,y1, 'b','lineWidth',3);

plot(x,y2, 'w','lineWidth',7);
plot(x,y2, 'r','lineWidth',3);




%# text
%# ------------------------
ll(1) = text(1.3, 4.2,...
    {'Walking back to my'
    'front door at night:'});

ll(2) = text(5, 0.7, 'yard');
ll(3) = text(6.2, 0.7, 'steps');
ll(4) = text(7, 0.7, 'door');
ll(5) = text(8, 0.7, 'inside');

set(ll, textprops{:});


%# arrows & lines
%# ------------------------

%# box around "walking back..."
xx = 1.2:0.1:3.74;
yy = ns(xx, 4.6) + noise(xx, 0.007);
plot(xx, yy, blackline{:})

xx = 1.2:0.1:3.74;
yy = ns(xx, 3.8) + noise(xx, 0.007);
plot(xx, yy, blackline{:})

yy = 3.8:0.1:4.6;
xx = ns(yy, 1.2) + noise(yy, 0.007);
plot(xx, yy, blackline{:})

xx = ns(yy, 3.74) + noise(yy, 0.007);
plot(xx, yy, blackline{:})

%# left arrow
x_arr = 1.2:0.1:4.8;
y_arr = 0.65 * ones(size(x_arr)) + noise(x_arr, 0.005);
plot(x_arr, y_arr, blackline{:})
x_head = [1.1 1.6 1.62];
y_head = [0.65 0.72 0.57];
patch(x_head, y_head, 'k')

%# right arrow
x_arr = 8.7:0.1:9.8;
y_arr = 0.65 * ones(size(x_arr)) + noise(x_arr, 0.005);
plot(x_arr, y_arr, blackline{:})
x_head = [9.8 9.3 9.3];
y_head = [0.65 0.72 0.57];
patch(x_head, y_head, 'k')

%# left line on axis
y_line = 0.8:0.1:1.1;
x_line = ns(y_line, 6.5) + noise(y_line, 0.005);
plot(x_line, y_line, blackline{:})

%# right line on axis
y_line = 0.8:0.1:1.1;
x_line = ns(y_line, 7.2) + noise(y_line, 0.005);
plot(x_line, y_line, blackline{:})

%# axes
x_xax = x;
y_xax = 0.95 + noise(x_xax, 0.01);
y_yax = 0.95:0.1:5;
x_yax = x(1) + noise(y_yax, 0.01);
plot(x_xax, y_xax, axisline{:})
plot(x_yax, y_yax, axisline{:})


% finalize 
%# ------------------------

xlim([0.95 10])
ylim([0 5])
axis off

ফলাফল:

মতলবতে এক্সকেসিডি অনুকরণ

যা করতে হবে:

  1. আরও ভাল ফাংশন সন্ধান করুন (তাদের টুকরা অনুসারে আরও সংজ্ঞায়িত করুন)
  2. তারা বর্ণিত বক্ররেখগুলিতে "টিকাশ" এবং avyেউয়ের লাইন যুক্ত করুন
  3. কমিক সানসের চেয়ে ভাল ফন্টটি সন্ধান করুন!
  4. সমস্ত কিছুকে একটি ক্রিয়ায় সাধারণীকরণ করুন plot2xkcdযাতে আমরা যে কোনও প্লট / চিত্রকে xkcd স্টাইলে রূপান্তর করতে পারি ।

1
রঙ এবং কুড়াল দিয়ে দুর্দান্ত কাজ! যদিও আমি মনে করি তারা কিছুটা চটজলদি। যাইহোক +1।
জোনাস

@ হাইপায়ারম্যান্সমার্ক: আমি এখনও মনে করি না যে এটি খুব দরকারী, তবে এটি খুব মজাদার :)
রডি ওলেনহুইস

নিবন্ধন করুন মূল প্লটগুলির চেয়ে স্টাইলযুক্ত প্লটগুলি দেখতে ভাল লাগছে find শৈলী যুক্ত করা অবশ্যই একটি বৈধ ফাংশন।
স্লেটন

2
@ স্লেটন: আসুন আমরা একটি অত্যন্ত উন্নত সংখ্যার ক্রাঞ্চিংয়ের সরঞ্জামটি গ্রহণ করি যা অত্যন্ত দক্ষ, ডিজাইন করা হয়েছিল সুন্দর, প্রকাশ্য-প্রস্তুত প্লট যথাসম্ভব যথাযথভাবে তৈরি করতে সক্ষম, এবং এটি তৈরিতে ব্যবহার করা যাক ... ** কমিকস ** এটির সাথে । দুঃখিত, এটি নিরীহ। তবে এটি খুব মজাদার , এ কারণেই এখানে বেশিরভাগ লোক উপবিষ্ট হয়েছিল এবং কী প্রশ্নটি আবার খোলা হয়েছিল। এটি কি ভবিষ্যতের দর্শনার্থীদের কোনও কাজে আসবে? ওয়েল ... এটা নেই অনুপ্রাণিত করা। সম্ভবত এটি কিছু লোককে মতলব শেখার জন্য আমন্ত্রণ জানাবে। তবে xkcd- স্টাইলের কাজটি সঠিকভাবে করার জন্য হ্যাক এবং কৌশলগুলি দরকার যা আহ ... খুব কমপক্ষে প্রশ্নবিদ্ধ :)
রডি ওলেনহুইস

6
@ রডিয়ালডেনহুইস: আমি একজনের জন্য আমার উপস্থাপনাগুলিতে এই গ্রাফগুলি ব্যবহার করব। এবং এটি সাধারণত "হ্যাকস" এর সাথে থাকে যে আপনি বাস্তবে পরিবেশ কীভাবে কাজ করে তা শিখেন।
জোনাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.